这个提交包含在:
2023-12-19 10:49:54 +08:00
父节点 83048b5c60
当前提交 20a8c77b0c
共有 45 个文件被更改,包括 2225 次插入68 次删除

63
.gitattributes vendored 普通文件
查看文件

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

253
.gitignore vendored 普通文件
查看文件

@@ -0,0 +1,253 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Xx]64/
[Xx]86/
[Bb]uild/
bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Un-comment the next line if you do not want to checkin
# your web deploy settings because they may include unencrypted
# passwords
#*.pubxml
*.publishproj
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directory
AppPackages/
BundleArtifacts/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# LightSwitch generated files
GeneratedArtifacts/
ModelManifest.xml
# Paket dependency manager
.paket/paket.exe
# FAKE - F# Make
.fake/
*.u2d
/tem3dfdtd/CTIME_TIXING_UPCOS.DAT
/tem3dfdtd/CDELZ.DAT
/tem3dfdtd/CDELY.DAT
/tem3dfdtd/CDELX.DAT
/tem3dfdtd/Air-Line=081-H=001.dat
/tem3dfdtd/Air-Line=081-H=000.dat
/tem3dfdtd/Split.dat
/tem3dfdtd/PostProcessFileList.dat
/tem3dfdtd/HzCoordinate.dat
/tem3dfdtd/Ground-Line=081.dat

查看文件

@@ -1,36 +1,4 @@
# tem3dfdtd-open # tem3dfdtd-open
#### Description #### Description
{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**} Please visit https://em3d.cn for more information.
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

查看文件

@@ -1,39 +1,5 @@
# tem3dfdtd-open # tem3dfdtd-open
#### 介绍 #### 介绍
{**以下是 Gitee 平台说明,您可以替换此简介** 请访问https://em3d.cn/ 获取更多信息。
Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN。专为开发者提供稳定、高效、安全的云端软件开发协作平台
无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
#### 软件架构
软件架构说明
#### 安装教程
1. xxxx
2. xxxx
3. xxxx
#### 使用说明
1. xxxx
2. xxxx
3. xxxx
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

28
tem3dfdtd.sln 普通文件
查看文件

@@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "tem3dfdtd", "tem3dfdtd\tem3dfdtd.vfproj", "{94A7F592-24DB-4139-B709-699C1B4A8B1A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Debug|x64.ActiveCfg = Debug|x64
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Debug|x64.Build.0 = Debug|x64
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Debug|x86.ActiveCfg = Debug|Win32
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Debug|x86.Build.0 = Debug|Win32
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Release|x64.ActiveCfg = Release|x64
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Release|x64.Build.0 = Release|x64
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Release|x86.ActiveCfg = Release|Win32
{94A7F592-24DB-4139-B709-699C1B4A8B1A}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

2
tem3dfdtd/README.md 普通文件
查看文件

@@ -0,0 +1,2 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)

1
tem3dfdtd/doc/README.md 普通文件
查看文件

@@ -0,0 +1 @@
this folder is used to store the doc file!

二进制
tem3dfdtd/doc/说明书-Chinese.docx 普通文件

二进制文件未显示。

查看文件

@@ -0,0 +1 @@
this folder is used to store the examples!

查看文件

@@ -0,0 +1,64 @@
!the standard input file for TEM calculation.Version 2.0 start to creat @2016-10-30 by Huaifeng Sun
!finishe to creat @
!this is the configuration type for the modeling
!airborne, semi-airborne, ground, surface-borehole, tunnel, marine are the options
#configuration_type:
SEMI
!source length
#source-parameters:
3
!cell numbers in x,y,z directions
!minumun grid size in uniform parts
#cell-parameters:
161,161,160
0.5
!background resistivity
!number if abnormal bodies
!the numbered abnormal body cell range in x diretion,y diretion,z diretion,resistivity
#resistivity-parameters:
0.01
6
1,161,1,161,1,80,1e-4
1,161,1,161,80,81,0.002
1,161,1,161,81,83,0.0033
76,86,76,86,86,92,0.02
76,86,76,86,92,98,0.033
76,86,76,86,98,106,0.05
#n-stop:
3500000
!The maximum computation time, unit of which is ms
!the raise time and its step
!the wave length time
!the ramp time and its step
!timestep
!current in amper
!waveform-type
#waveform-parameters:
30.002
1e-6,1e-9
10000e-6
1e-6,1e-9
1e-7
1
TIXING_UPCOS
!number of flight hight
!flight hight
#flight-parameters:
2
0.5,1
!HE stands for horizontal value,HZ stands for vertical value
!number of survey lines
!start and stop point cell number
#receiver-parameters:
HE
1
66,96

43
tem3dfdtd/example/input.dat 普通文件
查看文件

@@ -0,0 +1,43 @@
SEMI
3
161,161,160
0.5
0.01
6
1,161
1,161
1,80
1e-4
1,161
1,161
80,81
0.002
1,161
1,161
81,83
0.0033
76,86
76,86
86,92
0.02
76,86
76,86
92,98
0.033
76,86
76,86
98,106
0.05
3500000
30.002
1e-6,1e-9
10000e-6
1e-6,1e-9
1e-7
1
2
0.5,1
TIXING_UPCOS
HE
1
66,96

99
tem3dfdtd/example/input.xml 普通文件
查看文件

@@ -0,0 +1,99 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Version 1.0-->
<model>
<!--!this is the configuration type for the modeling-->
<!--!airborne, semi-airborne, ground, surface-borehole,
tunnel, marine are the options-->
<configuration>SEMI</configuration>
<source>
<source_length>3</source_length>
<source_type>loop</source_type>
<current>1.0</current>
<Tx_waveform>TIXING_UPCOS</Tx_waveform>
</source>
<cell>
<x>161</x>
<y>161</y>
<z>160</z>
<mini_size>0.5</mini_size>
</cell>
<!--This is the time parameters in the iteration. -->
<!--the total_time corresponds to the computation time from 0 to the end-->
<time>
<total_time>30.002</total_time >
<raise_time>1e-6,1e-9</raise_time >
<ramp_time>1e-6,1e-9</ramp_time>
<on_time>1.0e-2</on_time>
<off_time_step_max>1.0e-7</off_time_step_max>
<max_stop_iteration>3500000</max_stop_iteration>
</time>
<Rx_parameters>
<num_record_height>2</num_record_height>
<heights>0.5,1</heights>
<rec_flag>HE</rec_flag>
<Rx_lines_num>1</Rx_lines_num>
<Rx_range>66,96</Rx_range>
</Rx_parameters>
<resistivity_parameters>
<background>0.01</background>
<abnormal>
<number>6</number>
<block1>
<x_range>1,161</x_range>
<y_range>1,161</y_range>
<z_range>1,80</z_range>
<conductivity>1e-4</conductivity>
</block1>
<block2>
<x_range>1,161</x_range>
<y_range>1,161</y_range>
<z_range>80,81</z_range>
<conductivity>0.002</conductivity>
</block2>
<block3>
<x_range>1,161</x_range>
<y_range>1,161</y_range>
<z_range>81,83</z_range>
<conductivity>0.0033</conductivity>
</block3>
<block4>
<x_range>76,86</x_range>
<y_range>76,86</y_range>
<z_range>86,92</z_range>
<conductivity>0.02</conductivity>
</block4>
<block5>
<x_range>76,86</x_range>
<y_range>76,86</y_range>
<z_range>82,98</z_range>
<conductivity>0.033</conductivity>
</block5>
<block6>
<x_range>76,86</x_range>
<y_range>76,86</y_range>
<z_range>98,106</z_range>
<conductivity>0.05</conductivity>
</block6>
</abnormal>
</resistivity_parameters>
</model>

查看文件

@@ -0,0 +1,20 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!function description
!this suboutine is used to select and call some suboutine to close some
!selected files.
!2016-10-30
subroutine CloseRecFiles
use constantparameters
implicit none
integer ii,jj
select case(RecFlag)
case('Hz')
call SubCloseRecFiles('Hz')
case('HE')
call SubCloseRecFiles('HE')
end select
end subroutine CloseRecFiles

查看文件

@@ -0,0 +1,22 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine GetSourcePosition
! This subroutine initialize the value of array is_ex_in_source which is used when judging whether the grid contains the source
! For the modification of OpenACC code.
use constantparameters
IMPLICIT NONE
INTEGER ii,jj
is_ex_in_source=0; is_ey_in_source=0
do ii=nxs-(SourceGridNum-1)/2,nxs+(SourceGridNum-1)/2,1
is_ex_in_source(ii,nys-(SourceGridNum-1)/2)=1
is_ex_in_source(ii,nys+(SourceGridNum+1)/2)=-1
end do
! Aware that the value of source has both positive and negative parts, or they will cancel each other out.
do ii=nys-(SourceGridNum-1)/2,nys+(SourceGridNum-1)/2,1
is_ey_in_source(nxs-(SourceGridNum-1)/2,ii)=-1
is_ey_in_source(nxs+(SourceGridNum+1)/2,ii)=1
end do
end subroutine GetSourcePosition

264
tem3dfdtd/lib/Iteration.f90 普通文件
查看文件

@@ -0,0 +1,264 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
! --------------------------------Subroutine part---------------------------------------------!
subroutine Iteration
use constantparameters
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
implicit none
real::t1,t2,t !t1 denotes original cpu time at the beginning of each computation fraction, t2 denotes the end cpu time and t=t2-t1
REAL*8 CA,CB,DELX1,DELY1,DELZ1 !ca, cb, delx1, dely1, delz1 are all middle variables used in the computation of EM field
REAL*8 TEMP_SIG,temp_cacb !Temp_sig and temp_cacb are middle variables used in the computation of EM field
REAL*8 DELY2,DELZ2,delx2 !They are all middle variables as above ones.
integer num,i,j,k,ii !num is the number of computation fraction
real*8,allocatable::Meps_r(:),Mdelt(:),Msource(:),Mcq(:) !They are local substitution of eps_r, delt and cq
do num=1,num_fra_com,1 !The outer loop which begins from the first fraction ends at the last fraction
call cpu_time(t1) !Record the cpu time at the beginning of each computing fraction
allocate(mdelt(0:mstop(num)),meps_r(mstop(num)),mcq(mstop(num)),msource(mstop(num)))
! The memory of mdelt, meps_r, mcq and msource are allocated at the begining of fraction
do ii=mstart(num),mstart(num)+mstop(num)-1,1
mdelt(ii-mstart(num)+1)=delt(ii)
meps_r(ii-mstart(num)+1)=eps_r(ii)
mcq(ii-mstart(num)+1)=cq(ii)
msource(ii-mstart(num)+1)=source(ii) !Link the local value of mdelt, meps_r, mcq and msorce to the global value of delt, eps_r, cq and source array.
end do
print*,'Now computing fraction:',num
mdelt(0)=mdelt(1)
!$acc data copy(Ex(1:nx,1:nyb,1:nzb),Ey(1:nxb,1:ny,1:nzb),Ez(1:nxb,1:nyb,1:nz))&
!$acc copy(Hx(1:nxb,1:ny,0:nz),Hy(1:nx,1:nyb,0:nz),Hz(1:nx,1:ny,1:nzb)),copyin(cdelx(1:nx))&
!$acc copyin(ccsig(1:nx,1:ny,1:nz),mdelt(0:mstop(num)),cdely(1:ny),cdelz(1:nz),mcq(1:mstop(num)),meps_r(1:mstop(num)))&
!$acc copyin(is_ex_in_source(1:nx,2:nyb-1),is_ey_in_source(2:nx,1:ny),msource(1:mstop(num)))
! OpenACC directive, copy in and out of Ex,Ey,Ez,Hx,Hy,Hz, copy in ccsig, mdelt, cdelz, mcq, meps_r, is_ex_in_source, is_ey_in_source
do loop=1,mstop(num),1
! --------------------------------update the value of Ex and Ey in source area---------------------------------------!
!$acc parallel async(1)
!$acc loop gang
DO J=2,NYB-1
!$acc loop vector
DO I=1,NX
K=NZ/2+1
DELY1=(CDELY(J-1)+CDELY(J))/2.0D0
DELZ1=CDELZ(NZ/2+1)
TEMP_SIG=CCSIG(I,J-1,K-1)*CDELY(J-1)*CDELZ(K-1)&
&+CCSIG(I,J-1,K)*CDELY(J-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELY(J)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELY(J)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELY1*DELZ1)
CA=(2.0D0*Meps_r(loop)-Mdelt(LOOP-1)*TEMP_SIG)/(2.0*Meps_r(loop)+Mdelt(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EX(I,J,K)=CA*EX(I,J,K)+CB*((HZ(I,J,K)-HZ(I,J-1,K))/DELY1-(HY(I,J,K)-HY(I,J,K-1))/DELZ1)-cb*Msource(loop)*is_ex_in_source(i,j)
ENDDO
ENDDO
!$acc end parallel
! end of updating Ex while k=Nzs+1
! update the value of Ey while k=Nzs+1
!$acc parallel async(2)
!$acc loop gang
DO J=1,NY
!$acc loop vector
DO I=2,NX
K=NZ/2+1
DELX1=(CDELX(I-1)+CDELX(I))/2.0
DELZ1=CDELZ(NZ/2+1)
TEMP_SIG=CCSIG(I-1,J,K-1)*CDELX(I-1)*CDELZ(K-1)&
&+CCSIG(I-1,J,K)*CDELX(I-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELX(I)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELX(I)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELX1*DELZ1)
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EY(I,J,K)=CA*EY(I,J,K)+CB*((HX(I,J,K)-HX(I,J,K-1))/DELZ1-(HZ(I,J,K)-HZ(I-1,J,K))/DELX1)-cb*Msource(loop)*is_ey_in_source(i,j)
ENDDO
ENDDO
!$acc end parallel
! end of uptating Ey while k=Nzs+1
! ---------------------------------------------------Ex Part-------------------------------------------------------------!
!$acc parallel async(3)
!$acc loop gang
DO K=NZ/2+2,NZ
!$acc loop worker
DO J=2,NY
!$acc loop vector
DO I=1,NX
DELY1=(CDELY(J-1)+CDELY(J))/2.0D0
DELZ1=(CDELZ(K-1)+CDELZ(K))/2.0D0
TEMP_SIG=CCSIG(I,J-1,K-1)*CDELY(J-1)*CDELZ(K-1)&
&+CCSIG(I,J-1,K)*CDELY(J-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELY(J)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELY(J)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELY1*DELZ1)
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EX(I,J,K)=CA*EX(I,J,K)+CB*((HZ(I,J,K)-HZ(I,J-1,K))/DELY1-(HY(I,J,K)-HY(I,J,K-1))/DELZ1)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!$acc parallel async(4)
!$acc loop gang
DO K=2,NZ/2
!$acc loop worker
DO J=2,NY
!$acc loop vector
DO I=1,NX
DELY1=(CDELY(J-1)+CDELY(J))/2.0D0
DELZ1=(CDELZ(K-1)+CDELZ(K))/2.0D0
TEMP_SIG=CCSIG(I,J-1,K-1)*CDELY(J-1)*CDELZ(K-1)&
&+CCSIG(I,J-1,K)*CDELY(J-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELY(J)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELY(J)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELY1*DELZ1)
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EX(I,J,K)=CA*EX(I,J,K)+CB*((HZ(I,J,K)-HZ(I,J-1,K))/DELY1-(HY(I,J,K)-HY(I,J,K-1))/DELZ1)
ENDDO
ENDDO
ENDDO
!$acc end parallel
! ================end of updating Ex==================!
! -----------------------------------------update the value of Ey--------------------------------!
!$acc parallel async(5)
!$acc loop gang
DO K=NZ/2+2,NZ
!$acc loop worker
DO J=1,NY
!$acc loop vector
DO I=2,NX
DELX1=(CDELX(I-1)+CDELX(I))/2.0D0
DELZ1=(CDELZ(K-1)+CDELZ(K))/2.0D0
TEMP_SIG=CCSIG(I-1,J,K-1)*CDELX(I-1)*CDELZ(K-1)&
&+CCSIG(I-1,J,K)*CDELX(I-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELX(I)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELX(I)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELX1*DELZ1)
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EY(I,J,K)=CA*EY(I,J,K)+CB*((HX(I,J,K)-HX(I,J,K-1))/DELZ1-(HZ(I,J,K)-HZ(I-1,J,K))/DELX1)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!$acc parallel async(6)
!$acc loop gang
DO K=2,NZ/2
!$acc loop worker
DO J=1,NY
!$acc loop vector
DO I=2,NXB-1
DELX1=(CDELX(I-1)+CDELX(I))/2.0D0
DELZ1=(CDELZ(K-1)+CDELZ(K))/2.0D0
TEMP_SIG=CCSIG(I-1,J,K-1)*CDELX(I-1)*CDELZ(K-1)&
&+CCSIG(I-1,J,K)*CDELX(I-1)*CDELZ(K)&
&+CCSIG(I,J,K-1)*CDELX(I)*CDELZ(K-1)&
&+CCSIG(I,J,K)*CDELX(I)*CDELZ(K)
TEMP_SIG=TEMP_SIG/(4.0D0*DELX1*DELZ1)
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
CB=(2.0D0*MDELT(LOOP-1))/(2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG)
EY(I,J,K)=CA*EY(I,J,K)+CB*((HX(I,J,K)-HX(I,J,K-1))/DELZ1-(HZ(I,J,K)-HZ(I-1,J,K))/DELX1)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!===============end of updating Ey===================!
! -------------------------------------update the value of Ez--------------------------------------!
!$acc parallel async(7)
!$acc loop gang
DO K=1,NZ
!$acc loop worker
DO J=2,NYB-1
!$acc loop vector
DO I=2,NXB-1
DELX1=(CDELX(I-1)+CDELX(I))/2.0D0
DELY1=(CDELY(J-1)+CDELY(J))/2.0D0
TEMP_SIG=CCSIG(I-1,J-1,K)*CDELX(I-1)*CDELY(J-1)&
&+CCSIG(I-1,J,K)*CDELX(I-1)*CDELY(J)&
&+CCSIG(I,J-1,K)*CDELX(I)*CDELY(J-1)&
&+CCSIG(I,J,K)*CDELX(I)*CDELY(J)
TEMP_SIG=TEMP_SIG/(4.0D0*DELX1*DELY1)
TEMP_CACB=2.0D0*Meps_r(loop)+MDELT(LOOP-1)*TEMP_SIG
CA=(2.0D0*Meps_r(loop)-MDELT(LOOP-1)*TEMP_SIG)/TEMP_CACB
CB=(2.0D0*MDELT(LOOP-1))/TEMP_CACB
EZ(I,J,K)=CA*EZ(I,J,K)+CB*((HY(I,J,K)-HY(I-1,J,K))/DELX1-(HX(I,J,K)-HX(I,J-1,K))/DELY1)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!$acc wait
!===============end of updating Ez=========================!
! ------------------------------------update the value of Hx-----------------------------------------------!
!$acc parallel async(8)
!$acc loop gang
DO K=1,NZ
!$acc loop worker
DO J=1,NY
!$acc loop vector
DO I=1,NXB
DELY2=CDELY(J)
DELZ2=CDELZ(K)
HX(I,J,K)=HX(I,J,K)-MCQ(LOOP)*((EZ(I,J+1,K)-EZ(I,J,K))/DELY2-(EY(I,J,K+1)-EY(I,J,K))/DELZ2)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!================end of updating Hx=======================!
! -------------------------------------update the value of Hy---------------------------------------------!
!$acc parallel async(9)
!$acc loop gang
DO K=1,NZ
!$acc loop worker
DO J=1,NYB
!$acc loop vector
DO I=1,NX
DELZ2=CDELZ(K)
DELX2=CDELX(I)
HY(I,J,K)=HY(I,J,K)-MCQ(LOOP)*((EX(I,J,K+1)-EX(I,J,K))/DELZ2-(EZ(I+1,J,K)-EZ(I,J,K))/DELX2)
ENDDO
ENDDO
ENDDO
!$acc end parallel
!$acc wait
!===============end of updating Hy========================!
!-------------------------------------update the value of Hz----------------------------------------------!
!$acc kernels async(10)
DO J=1,NY
DO I=1,NX
DO K=NZ,NZ/2+1,-1 !NZ,2,-1 !
DELX2=CDELX(I)
DELY2=CDELY(J)
DELZ2=CDELZ(K)
HZ(I,J,K)=HZ(I,J,K+1)+DELZ2*((HX(I+1,J,K)-HX(I,J,K))/DELX2+(HY(I,J+1,K)-HY(I,J,K))/DELY2)
ENDDO
ENDDO
ENDDO
!$acc end kernels
!$acc kernels async(11)
DO K=1,NZ/2-1
DO J=1,NY
DO I=1,NX
DELX2=CDELX(I)
DELY2=CDELY(J)
DELZ2=CDELZ(K)
HZ(I,J,K+1)=HZ(I,J,K)-DELZ2*((HX(I+1,J,K)-HX(I,J,K))/DELX2+(HY(I,J+1,K)-HY(I,J,K))/DELY2)
ENDDO
ENDDO
ENDDO
!$acc end kernels
!$acc wait
!===================end of updating Hz==========================!
enddo
!$acc end data
call cpu_time(t2)
t=t2-t1
print*,'The computing time for this fraction is:', t
deallocate(meps_r,mcq,msource,mdelt)
call WriteRecFiles(num)
write(*,'(1x,e20.10e3,3x,e20.10e3)')Hz(nxs,nys+2,Nzs_air(1)),Hz(Nxs,Nys+2,Nz/2+1)
write(*,*)'Now loop is:',mstart(num)+mstop(num)-1
print*,mstop(num),'steps have just finished'
ENDDO
end subroutine Iteration

查看文件

@@ -0,0 +1,24 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine OpenRecFiles
! This subroutine opens all the files needed to record data of interests
use constantparameters
implicit none
integer ii,jj
PostProcessFilePid=19999; SplitFilePid=19998
PostProcessFile='PostProcessFileList.dat'; SplitFile='Split.dat'
! This file is used to dominate the post-process program which records all the filenames needed to be processed and some other parameters.
open(PostProcessFilePid,file=PostProcessFile)
open(SplitFilePid,file=SplitFile)
select case(RecFlag)
case('HE')
call SubOpenRecFiles('HE')
case('Hz')
call SubOpenRecFiles('Hz')
end select
write(PostProcessFilePid,'(e12.6e2)')raisetime+wave+ramp
close(PostProcessFilePid)
end subroutine OpenRecFiles

查看文件

@@ -0,0 +1,21 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine SubCloseRecFiles(Flag)
use constantparameters
implicit none
character*2 Flag
integer ii,jj
select case(Flag)
case('Hz')
RecFilePid=RecHzFilePid
case('HE')
RecFilePid=RecHEFilePid
end select
do ii=1,NumRecHeights,1
do jj=1,NumRecLines,1
close(RecFilePid(ii,jj))
end do
end do
end subroutine SubCloseRecFiles

查看文件

@@ -0,0 +1,84 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine SubOpenRecFiles(Flag)
use constantparameters
implicit none
integer ii,jj
character*2 Flag
character*30 string
do ii=1,NumRecHeights,1
write(Height(ii),'(i3.3)')FlightHeight(ii) !Convert real kind of variable to character so that it can be used in the filename distribution process
Height(ii)=trim(adjustl(Height(ii)))
end do
write(PostProcessFilePid,*) (NumRecLines)*(1+NumRecHeights),RecPointMin,RecPointMax !The number of total recording files
write(SplitFilePid,*)NumRecLines,NumRecPoints,NumRecHeights
do ii=1,NumRecLines,1
write(SplitFilePid,*)RecLine(ii)
end do
do ii=1,NumRecPoints,1
write(SplitFilePid,*)RecPoint(ii)
end do
do ii=1,NumRecHeights,1
write(SplitFilePid,*)FlightHeight(ii)
end do
close(SplitFilePid)
! -------------------------------------------------check for RecFilePid------------------------------------!
! if NumRecPoints is greater than 500, then the value of RecFilePid must be reset
! ----------------------------------------------------------------------------------------------------------------!
if(NumRecLines.ge.2000)then
print*,'NumRecLines is greater than 1000! Reset the value of RecFilePid in subroutine "OpenRecFiles"'
! This is because the distribution of file pid. You should modify the distribution part if your recording files number is greater than 1000.
stop
end if
! ----------------------------------------------------------------------------------------------------------------!
! -------------------------------------File Pid Distribution------------------------------------------------!
! Change it whenever you need to do so
! ----------------------------------------------------------------------------------------------------------------!
if(Flag.eq.'Hz')then
do jj=1,NumRecLines,1
RecFilePid(1,jj)=20000+jj !For the ground plane.
do ii=1,NumRecHeights,1
RecFilePid(ii+1,jj)=20000+ii*2000+jj !For the air plane, with multiple height
end do
enddo
RecHzFilePid=RecFilePid !Transfer the value of RecFilePid to RecHzFilePid if Flag.eq.'Hz'
elseif(Flag.eq.'HE')then
do jj=1,NumRecLines,1
RecFilePid(1,jj)=20000+(NumRecHeights+1)*2000+jj
do ii=1,NumRecHeights,1
RecFilePid(ii+1,jj)=20000+(NumRecHeights+1+ii)*2000+jj
end do
enddo
RecHEFilePid=RecFilePid
end if
! --------------------------------------end of File Pid Distribution----------------------------------------------!
!------------------------------------------File name Distribution-------------------------------------------------!
do jj=1,NumRecLines,1
write(string,'(I3.3)')RecLine(jj)
RecFile(1,jj)='Ground-Line'//'='//trim(adjustl(string))//'.dat'
write(PostProcessFilePid,*)RecFile(1,jj)
do ii=1,NumRecHeights,1
RecFile(ii+1,jj)='Air-Line='//trim(adjustl(string))//'-H='//Height(ii)//'.dat'
write(PostProcessFilePid,*)RecFile(ii+1,jj)
end do
end do
select case(Flag)
case('Hz')
RecHzFile=RecFile
case('HE')
RecHEFile=RecFile
end select
! ------------------------------------end of File name Distribution---------------------------------------------!
! --------------------------------------open file code-------------------------------------------!
! if the compiler reports the error: 'Too Many Open FIles!', you can come to tdem.org website and find the solutions.
! -----------------------------------------------------------------------------------------------------!
do ii=1,NumRecHeights+1,1
do jj=1,NumRecLines,1
open(RecFilePid(ii,jj),file=RecFile(ii,jj))
end do
end do
! -----------------------------------end of opening file----------------------------------------!
end subroutine SubOpenRecFiles

查看文件

@@ -0,0 +1,82 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine SubWriteRecFiles(Flag,num)
! This subroutine writes all the data of intersted recording points from different recording plane which are given in the input.dat file.
use constantparameters
use electromagnetic_variables
use time_parameter
implicit none
integer ii,jj,kk,num
character*2 Flag
character*3 string
real*8 TmpHx(NumRecLines,NumRecPoints,NumRecHeights+1),TmpHy(NumRecLines,NumRecPoints,NumRecHeights+1),TmpHz(NumRecLines,NumRecPoints,NumRecHeights+1),&
&TmpEx(NumRecLines,NumRecPoints,NumRecHeights+1),TmpEy(NumRecLines,NumRecPoints,NumRecHeights+1),TmpEz(NumRecLines,NumRecPoints,NumRecHeights+1)
! -------------------------------------------case selection---------------------------------------------!
select case(Flag)
case('Hz')
RecFilePid=RecHzFilePid
do ii=1,NumRecLines,1
do jj=RecPointMin,RecPointMax,1
TmpHz(ii,jj-RecPointMin+1,1)=Hz(RecLine(ii),jj-RecPointMin+1,Nz/2+1)
end do
end do
do jj=1,NumRecLines,1
do ii=RecPointMin,RecPointMax,1
do kk=1,NumRecHeights,1
TmpHz(ii-RecPointMin+1,jj,kk+1)=Hz(RecLine(ii),jj,Nzs_air(kk))
end do
end do
end do
do ii=1,NumRecLines,1
do jj=RecPointMin,RecPointMax,1
write(string,'(I3.3)')jj
write(RecFilePid(1,ii),'(a3,2e20.10e3)')string,Ctime(mstart(num)+mstop(num)-1),TmpHz(RecLine(ii),jj-RecPointMin+1,1)
do kk=1,NumRecHeights,1
write(RecFilePid(kk+1,ii),'(a3,2e20.10e3)')string,Ctime(mstart(num)+mstop(num)-1),TmpHz(RecLine(ii),jj-RecPointMin+1,kk+1)
end do
end do
end do
case('HE')
RecFilePid=RecHEFilePid
do ii=1,NumRecLines,1
do jj=RecPointMin,RecPointMax,1
TmpEx(ii,jj-RecPointMin+1,1)=Ex(RecLine(ii),jj,Nz/2+1)
TmpEy(ii,jj-RecPointMin+1,1)=Ey(RecLine(ii),jj,Nz/2+1)
TmpEz(ii,jj-RecPointMin+1,1)=Ez(RecLine(ii),jj,Nz/2+1)
TmpHx(ii,jj-RecPointMin+1,1)=Hx(RecLine(ii),jj,Nz/2+1)
TmpHy(ii,jj-RecPointMin+1,1)=Hy(RecLine(ii),jj,Nz/2+1)
TmpHz(ii,jj-RecPointMin+1,1)=Hz(RecLine(ii),jj,Nz/2+1)
end do
end do
do ii=1,NumRecLines,1
do jj=RecPointMin,RecPointMax,1
do kk=1,NumRecHeights,1
TmpHx(ii,jj-RecPointMin+1,kk+1)=Hx(RecLine(ii),jj,Nzs_air(kk)+1)
TmpHy(ii,jj-RecPointMin+1,kk+1)=Hy(RecLine(ii),jj,Nzs_air(kk)+1)
TmpHz(ii,jj-RecPointMin+1,kk+1)=Hz(RecLine(ii),jj,Nzs_air(kk)+1)
TmpEx(ii,jj-RecPointMin+1,kk+1)=Ex(RecLine(ii),jj,Nzs_air(kk)+1)
TmpEy(ii,jj-RecPointMin+1,kk+1)=Ey(RecLine(ii),jj,Nzs_air(kk)+1)
TmpEz(ii,jj-RecPointMin+1,kk+1)=Ez(RecLine(ii),jj,Nzs_air(kk)+1)
end do
end do
end do
do ii=1,NumRecLines,1
do jj=RecPointMin,RecPointMax,1
write(string,'(I3.3)')jj
write(RecFilePid(1,ii),'(a3,7e20.10e3)')string,Ctime(mstart(num)+mstop(num)-1),TmpHx(ii,jj-RecPointMin+1,1),TmpHy(ii,jj-RecPointMin+1,1),TmpHz(ii,jj-RecPointMin+1,1),&
&TmpEx(ii,jj-RecPointMin+1,1),TmpEy(ii,jj-RecPointMin+1,1),TmpEz(ii,jj-RecPointMin+1,1)
do kk=1,NumRecHeights,1
write(RecFilePid(kk+1,ii),'(a3,7e20.10e3)')string,Ctime(mstart(num)+mstop(num)-1),TmpHx(ii,jj-RecPointMin+1,kk+1),TmpHy(ii,jj-RecPointMin+1,kk+1),TmpHz(ii,jj-RecPointMin+1,kk+1),&
&TmpEx(ii,jj-RecPointMin+1,kk+1),TmpEy(ii,jj-RecPointMin+1,kk+1),TmpEz(ii,jj-RecPointMin+1,kk+1)
end do
end do
end do
end select
! ------------------------------------------------------end case selection---------------------------------------------!
end subroutine SubWriteRecFiles

查看文件

@@ -0,0 +1,37 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!function description
!this subroutine is used to allocate dynamic memory to the selected array.
!all allocatable variables which can be allocated automaticly after getting
!the input parameters file are allocated here.
!2016-10-30 by Huaifeng Sun
SUBROUTINE ALLOCATEMEMORY
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
IMPLICIT NONE
INTEGER ERR
!<21><><EFBFBD><EFBFBD>ELECTROMAGNETIC_VARIABLES<45>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
WRITE(*,*)'Allocating memory... ...'
ALLOCATE(EX(NX,NYB,NZB), EY(NXB,NY,NZB), EZ(NXB,NYB,NZ), STAT=ERR)
ALLOCATE(HX(NXB,NY,0:NZ), HY(NX,NYB,0:NZ), HZ(NX,NY,NZB), STAT=ERR)
!<21><><EFBFBD><EFBFBD>RES_MODEL_PARAMETER<45>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
ALLOCATE(CCSIG(NX,NY,NZ), STAT=ERR)
!<21><><EFBFBD><EFBFBD>TIME_PARAMETER<45>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
ALLOCATE(CTIME(NSTOP), STAT=ERR)
ALLOCATE(DELT(0:NSTOP), STAT=ERR)
allocate(Eps_r(nstop),Cq(nstop))
allocate(is_ex_in_source(nx,2:nyb-1),is_ey_in_source(2:nx,ny))
allocate(RecHzFile(NumRecHeights+1,NumRecLines),RecHEFile(NumRecHeights+1,NumRecLines))
allocate(RecFile(NumRecHeights+1,NumRecLines),RecFilePid(NumRecHeights+1,NumRecLines))
allocate(RecHzFilePid(NumRecHeights+1,NumRecLines),RecHEFilePid(NumRecHeights+1,NumRecLines))
allocate(Height(NumRecHeights))
allocate(Coordix3(Nx),Coordiy3(Ny),Coordiz3(Nzb))
!THIS IS THE ARRAY FOR NON-UNIFORM GRID
ALLOCATE(CDELX(NX),CDELY(NY),CDELZ(NZ),STAT=ERR)
RETURN
ENDSUBROUTINE ALLOCATEMEMORY

查看文件

@@ -0,0 +1,32 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!function description
!this suboutine is used to write out the readed calculation parameters for
!errors or mistakes check.
!2016-10-30
SUBROUTINE CHECKPARAMETERS
USE CONSTANTPARAMETERS
IMPLICIT NONE
integer i
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: '
WRITE(10005,*)'<27><><EFBFBD>λ<EFBFBD><CEBB>߱߳<DFB1>Ϊ<EFBFBD><CEAA>',SourceLength
WRITE(10005,*)'X,Y,Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ϊ<EFBFBD><CEAA>',NX,NY,NZ
WRITE(10005,*)'<27><>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA> ',NXS,NYS,NZS
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA> ',NSTOP
WRITE(10005,*)
WRITE(10005,*)'X,Y,Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4>ֱ<EFBFBD>Ϊ<EFBFBD><CEAA>'
WRITE(10005,*)'DELTA_X=',GridSize
WRITE(10005,*)'DELTA_Y=',GridSize
WRITE(10005,*)'DELTA_Z=',GridSize
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7B5BC>',BACKGROUND_CONDUCTIVITY
WRITE(10005,*)
WRITE(10005,*)'<27><EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'
WRITE(10005,*)'NO X1 X2 Y1 Y2 Z1 Z2 CONDUCTIVITY'
DO I=1,SIZE(TAR_X1)
WRITE(10005,'(I3,6I5,ES15.6)')I,TAR_X1(I),TAR_X2(I),TAR_Y1(I),TAR_Y2(I),TAR_Z1(I),TAR_Z2(I),TAR_CONDUCTIVITY(I)
ENDDO
RETURN
ENDSUBROUTINE CHECKPARAMETERS

查看文件

@@ -0,0 +1,11 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!function description
!this suboutine is used to close #5300 file.
!2016-10-30
SUBROUTINE CLOSE_ADDTIONAL_SURVERY_POINTS_FILES
CLOSE(5300)
ENDSUBROUTINE CLOSE_ADDTIONAL_SURVERY_POINTS_FILES

查看文件

@@ -0,0 +1,19 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE FREE_MEMORY
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
IMPLICIT NONE
INTEGER ERR
DEALLOCATE(EX, EY, EZ, STAT=ERR)
DEALLOCATE(HX, HY, HZ, STAT=ERR)
DEALLOCATE(CCSIG, STAT=ERR)
DEALLOCATE(CTIME, STAT=ERR)
DEALLOCATE(DELT, STAT=ERR)
DEALLOCATE(CDELX,CDELY,CDELZ,STAT=ERR)
RETURN
ENDSUBROUTINE FREE_MEMORY

17
tem3dfdtd/lib/get-eps-r.f90 普通文件
查看文件

@@ -0,0 +1,17 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine Get_eps_r
use constantparameters
use time_parameter
implicit none
integer ii
do ii=1,nstop,1
EPS_R(ii)=3.0D0*(DELT(ii)/GridSize)**2/MU0
Cq(ii)=(DELT(ii-1)+DELT(ii))/(2.0D0*MU0)
! It is needed in the iterative subroutine, and we don't have to compute it in each iterative process.
enddo
end subroutine Get_eps_r

87
tem3dfdtd/lib/get-mstop.f90 普通文件
查看文件

@@ -0,0 +1,87 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine Get_mstop
! if the value of plus is too small, it will cause array bounds exceeded because the array bonds of Mstop and Mstart is set to 10000.
! If you do want to set a series of small plus, you should change the bounds of Mstop and Mstart in Module Constantparameters.---------------luxushan
use constantparameters
use time_parameter
implicit none
integer:: ii,jj,dt,plus,plusMid
! ----------------------------------------------------------------------------------------------------------------------------------!
ii=1; num_fra_com=1; plus=50 !Plus denotes the number of iteration steps in each computing fraction.
do while(ctime(ii).lt.raisetime) !This is the raising edge of trapeziodal waveform
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1
enddo
! -----------------------------------------------------------------------------------------------------------------------------------!
! The value of raisetime and raisestep have been set to 1e-6 and 1e-9 for centries so that you are supposed to set plus at a value that mod(1000, plus).eq.0
! ------------------------------------------------------------------------------------------------------------------------------------!
plus=2500 !The duration period is very long compared with the entire computation time so that the value of Plus is set to a comparatively large--
! --value so that you don't have to record too much useless values of EM field in duration period.
do while(ctime(ii).le.wave+raisetime)
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1
if(ctime(ii).gt.wave+raisetime)then
ii=ii-plus; num_fra_com=num_fra_com-1; jj=ii
do while(ctime(jj).le.raisetime+wave)
jj=jj+1
enddo
plus=jj-ii
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1;
endif
enddo
! -------------------------------------------------------------------------------------------------------------------------------------!
! -------------------------------------------------------------------------------------------------------------------------------------!
plus=10 !Sometimes the code diverges at the ramp time, so a comparatively small value is set to observe the divergence process
do while(ctime(ii).le.wave+raisetime+ramp)
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1
if(ctime(ii).gt.wave+raisetime+ramp)then
ii=ii-plus; num_fra_com=num_fra_com-1; jj=ii
do while(ctime(jj).le.raisetime+wave+ramp)
jj=jj+1
enddo
plus=jj-ii
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1;
endif
enddo
! -------------------------------------------------------------------------------------------------------------------------------------!
! -------------------------------------------------------------------------------------------------------------------------------------!
! In this part, plus keeps increasing because there seems to be no need to make a dense record in the late time of TEM problems---
! --and actually the instruments performs similar recording strategy, however, in a equal logarithm manner.
plus=10
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
num_fra_com=num_fra_com+1; ii=ii+plus
do while(ii.le.nstop)
plusMid=plus*1.1
if((plusMid-plus).le.1)then
plus=plus+1
else
plus=plusMid
end if
if(plus.ge.100)then
plus=100
end if
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
num_fra_com=num_fra_com+1
ii=ii+plus
if(ii.gt.nstop)then
ii=ii-plus; num_fra_com=num_fra_com-1; jj=ii
do while(jj.le.nstop)
jj=jj+1
enddo
plus=jj-ii
mstop(num_fra_com)=plus; mstart(num_fra_com)=ii
ii=ii+plus; num_fra_com=num_fra_com+1
endif
enddo
! ----------------------------end of distribution-----------------------------------------!
end subroutine Get_mstop
!--------------------------------------------------------------------------------------------------!

查看文件

@@ -0,0 +1,35 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE GET_SYS_TIMEDATA(OUTPUT)
! The original subroutien written by Huaifeng Sun can not work in PGI compiler, so I change it into what it looks like here.
IMPLICIT NONE
CHARACTER*4 TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6
CHARACTER*20 OUTPUT
integer*4 FortranDate(3),FortranTime(3)
INTEGER(4) TMPDAY, TMPMONTH, TMPYEAR
INTEGER(4) TMPHOUR, TMPMINUTE, TMPSECOND
!the following code is optimized by hfsun@2017-5-29 to modify an warning on the use of idate
!I also replace the function idate with idate4 to get a 4 digital year.
!But I received errors when use CALL idate4(FortranDate), so I use the temp solution idate4(tmpmonth,tmpday,tmpyear)
!CALL idate4(FortranDate)
CALL itime(FortranTime)
!tmpday=FortranDate(2); tmpmonth=FortranDate(1); tmpyear=FortranDate(3)
tmphour=FortranTime(1); tmpminute=FortranTime(2); tmpsecond=FortranTime(3)
CALL idate4(tmpmonth,tmpday,tmpyear)
!CALL itime(tmphour,tmpminute,tmpsecond)
!tmpday=FortranDate(2); tmpmonth=FortranDate(1); tmpyear=FortranDate(3)
!tmphour=FortranTime(1); tmpminute=FortranTime(2); tmpsecond=FortranTime(3)
WRITE(TEMP1,'(I4)')TMPYEAR
WRITE(TEMP2,'(I2)')TMPMONTH
WRITE(TEMP3,'(I2)')TMPDAY
WRITE(TEMP4,'(I4)')TMPHOUR
WRITE(TEMP5,'(I4)')TMPMINUTE
WRITE(TEMP6,'(I4)')TMPSECOND
OUTPUT=TRIM(ADJUSTL(TEMP1))//'-'//TRIM(ADJUSTL(TEMP2))//'-'//TRIM(ADJUSTL(TEMP3))//' '//TRIM(ADJUSTL(TEMP4))//':'//TRIM(ADJUSTL(TEMP5))//':'//TRIM(ADJUSTL(TEMP6))
OUTPUT=TRIM(ADJUSTL(OUTPUT))
RETURN
ENDSUBROUTINE GET_SYS_TIMEDATA

查看文件

@@ -0,0 +1,176 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE GET_NON_UNIFORMGRID
USE CONSTANTPARAMETERS
USE OMP_LIB
IMPLICIT NONE
INTEGER II
INTEGER MID_P,LEFT_P,RIGHT_P,UP_P,DOWN_P
REAL(KIND=8) CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
! -------------------------mesh-z-------------------------------------------!
Coordiz3(nzs)=-GridSize; Coordiz3(nzs+1)=0
do ii=nzs-20,nzs+20,1
Cdelz(ii)=GridSize
end do !Uniform mesh in an area equal to source length
do ii=nzs-21,1,-1
Cdelz(ii)=Cdelz(ii+1)*scale_par
if(Cdelz(ii).gt.200)then
Cdelz(ii)=200
end if
end do !Ununiform mesh in the air.
do ii=nzs+21,nz,1
Cdelz(ii)=Cdelz(ii-1)*scale_par
if(Cdelz(ii).gt.200)then
Cdelz(ii)=200
end if
end do !Ununiform mesh underground
do ii=nzs-1,1,-1
Coordiz3(ii)=Coordiz3(ii+1)-Cdelz(ii)
end do
do ii=nzs+2,nz,1
Coordiz3(ii)=Coordiz3(ii-1)+Cdelz(ii)
end do !Record the coordination information of each grid.
! ----------------------------end of mesh------------------------------------!
! -------------------------------mesh x----------------------------------------!
if(SourceLength/GridSize.gt.51)then
do ii=nxs-(SourceLength/GridSize-1)/2,nxs+(SourceLength/GridSize-1)/2,1
Cdelx(ii)=GridSize
end do
do ii=nxs-(SourceLength/GridSize-1)/2-1,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
end if
end do
do ii=nxs+(SourceLength/GridSize-1)/2+1,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
end if
end do
else
do ii=nxs-50,nxs+50,1
Cdelx(ii)=GridSize
end do
do ii=nxs-51,1,-1
Cdelx(ii)=Cdelx(ii+1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
end if
end do
do ii=nxs+51,nx,1
Cdelx(ii)=Cdelx(ii-1)*scale_par
if(Cdelx(ii).gt.200)then
Cdelx(ii)=200
endif
end do
end if
Coordix3(nxs)=0
do ii=nxs-1,1,-1
Coordix3(ii)=Coordix3(ii+1)-(Cdelx(ii)+Cdelx(ii+1))/2
end do
do ii=nxs+1,nx,1
Coordix3(ii)=Coordix3(ii-1)+(Cdelx(ii-1)+Cdelx(ii))/2
end do
! -----------------------------end of mesh------------------------------------!
! --------------------------------mesh y----------------------------------------!
if(SourceLength/GridSize.gt.51)then
do ii=nys-(SourceLength/GridSize-1)/2,nys+(SourceLength/GridSize-1)/2,1
Cdely(ii)=GridSize
enddo
do ii=nys-(SourceLength/GridSize-1)/2-1,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
do ii=nys+(SourceLength/GridSize-1)/2+1,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
endif
end do
else
do ii=nys-25,nys+25,1
Cdely(ii)=GridSize
end do
do ii=nys-26,1,-1
Cdely(ii)=Cdely(ii+1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
do ii=nys+26,ny,1
Cdely(ii)=Cdely(ii-1)*scale_par
if(Cdely(ii).gt.200)then
Cdely(ii)=200
end if
end do
end if
Coordiy3(nys)=-(GridSize/2); Coordiy3(nys+1)=GridSize/2
do ii=nys-1,1,-1
Coordiy3(ii)=Coordiy3(ii+1)-(Cdely(ii)+Cdely(ii+1))/2
end do
do ii=nys+1,ny,1
Coordiy3(ii)=Coordiy3(ii-1)+(Cdely(ii)+Cdely(ii-1))/2
end do
! ------------------------------end of mesh-----------------------------------!
! ------------------------------record coordinate----------------------------!
open(10006,file='HzCoordinate.dat') !You can find the coordination information of each grid in this file.
write(10006,*)nx,ny,nz
write(10006,*)'!---------------------------------X part--------------------------------!'
do ii=1,nx,1
write(10006,*)ii,Coordix3(ii)
end do
write(10006,*)'!----------------------------end of X part----------------------------!'
write(10006,*)'!---------------------------------Y part---------------------------------!'
do ii=1,ny,1
write(10006,*)ii,Coordiy3(ii)
end do
write(10006,*)'!----------------------------end of Y part----------------------------!'
write(10006,*)'!---------------------------------Z part---------------------------------!'
do ii=1,nz,1
write(10006,*)ii,Coordiz3(ii)
end do
write(10006,*)'!----------------------------end of Z part----------------------------!'
close(10006)
!----------------------------end of recording-------------------------------!
CDELX_LENGTH=SUM(CDELX)
CDELY_LENGTH=SUM(CDELY)
CDELZ_LENGTH=SUM(CDELZ)
WRITE(10005,*)'<27><><EFBFBD>õ<EFBFBD>ģ<EFBFBD>ͳߴ<CDB3>Ϊ<EFBFBD><CEAA>'
WRITE(10005,*)'SUM_X=',CDELX_LENGTH
WRITE(10005,*)'SUM_Y=',CDELY_LENGTH
WRITE(10005,*)'SUM_Z=',CDELZ_LENGTH
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>ϵ<EFBFBD><CFB5>=',SCALE_PAR
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>֮<EFBFBD><D6AE><=',MAX_RATIO
WRITE(10005,*)'X<><58><EFBFBD><EFBFBD><EFBFBD>ķǾ<C4B7><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>Ϊ<EFBFBD><CEAA>'
WRITE(10005,'(5F18.8)')CDELX
WRITE(10005,*)'Y<><59><EFBFBD><EFBFBD><EFBFBD>ķǾ<C4B7><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>Ϊ<EFBFBD><CEAA>'
WRITE(10005,'(5F18.8)')CDELY
WRITE(10005,*)'Z<><5A><EFBFBD><EFBFBD><EFBFBD>ķǾ<C4B7><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>Ϊ<EFBFBD><CEAA>'
WRITE(10005,'(5F18.8)')CDELZ
WRITE(*,*)'Model size:',CDELX_LENGTH,CDELY_LENGTH,CDELZ_LENGTH
OPEN(400,FILE='CDELX.DAT',STATUS='UNKNOWN')
DO II=1,NX
WRITE(400,'(E13.6)')CDELX(II)
ENDDO
CLOSE(400)
OPEN(400,FILE='CDELY.DAT',STATUS='UNKNOWN')
DO II=1,NY
WRITE(400,'(E13.6)')CDELY(II)
ENDDO
CLOSE(400)
OPEN(400,FILE='CDELZ.DAT',STATUS='UNKNOWN')
DO II=1,NZ
WRITE(400,'(E13.6)')CDELZ(II)
ENDDO
CLOSE(400)
ENDSUBROUTINE GET_NON_UNIFORMGRID

112
tem3dfdtd/lib/getdata.f90 普通文件
查看文件

@@ -0,0 +1,112 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE GETDATA
USE CONSTANTPARAMETERS
!this line is added by Huaifeng Sun to get the dir 2016-10-30
USE IFPORT
IMPLICIT NONE
LOGICAL ALIVE
INTEGER TEMP_II,III
!this following lines 10-21 are added by Huaifeng Sun to get the dir 2016-10-30
CHARACTER(255) dir
CHARACTER(255) InputFileName
INTEGER(4) length
length = GETDRIVEDIRQQ(dir)
IF (length .GT. 0) THEN
!WRITE (*,*) 'Current directory is: '
!WRITE (*,*) dir
InputFileName=trim(dir)//'//example//input.dat'
ELSE
WRITE (*,*) 'Failed to get current directory'
pause
END IF
!the following inputfilename type are modified by HFSun 2016-10-30
!INQUIRE(FILE='input.dat', EXIST=ALIVE)
INQUIRE(FILE=InputFileName, EXIST=ALIVE)
IF(.NOT. ALIVE) THEN
WRITE(10005,*) "input.dat DOES NOT EXIST."
STOP
ELSE
!OPEN(234,FILE='example/input.dat',STATUS='OLD')
OPEN(234,FILE=InputFileName,STATUS='OLD')
READ(234,'(a4)')CAL_TYPE !This is the calculation type, possible values are shown below.
IF(CAL_TYPE=='TUNNEL' .OR. CAL_TYPE=='tunnel')THEN
WRITE(10005,*)'隧道模型计算开关设置正确!'
ELSEIF(CAL_TYPE=='SEMI' .OR. CAL_TYPE=='semi')THEN
WRITE(10005,*)'SEMI-AIRBORNE计算开关设置正确'
ELSEIF(CAL_TYPE=='GROUND' .OR. CAL_TYPE=='ground')THEN
WRITE(10005,*)'地面模型计算开关设置正确!'
ELSE
WRITE(10005,*)'模型计算开关设置不正确,请确定采用地面模型还是隧道模型!'
STOP
ENDIF
READ(234,*)SourceLength
!The length of source, unit of which is meter, and you are supposed to set SourceLengh/GridSize as an odd number for the consideration of there will exist a central point within the source loop.
READ(234,*)NX,NY,NZ !The value of Nx, Ny and Nz varies from model to model.
READ(234,*)GridSize !Most commonly used value is 10m
READ(234,*)BACKGROUND_CONDUCTIVITY !Most commonly used value is 1e-2
READ(234,*)TEMP_II !It depends on your model, and it should be set to 0 if you are doing homogeneous model calculation.
ALLOCATE(TAR_X1(TEMP_II))
ALLOCATE(TAR_X2(TEMP_II))
ALLOCATE(TAR_Y1(TEMP_II))
ALLOCATE(TAR_Y2(TEMP_II))
ALLOCATE(TAR_Z1(TEMP_II))
ALLOCATE(TAR_Z2(TEMP_II))
ALLOCATE(TAR_CONDUCTIVITY(TEMP_II))
DO III=1,TEMP_II
READ(234,*)TAR_X1(III),TAR_X2(III)
READ(234,*)TAR_Y1(III),TAR_Y2(III)
READ(234,*)TAR_Z1(III),TAR_Z2(III)
READ(234,*)TAR_CONDUCTIVITY(III)
ENDDO
READ(234,*)NSTOP !The maximum iteration number.
READ(234,*)MAX_OFF_TIME !The maximum computation time, unit of which is ms
READ(234,*)RAISETIME,RAISESTEP !Most commonly used value is: Raisetime=1e-6, Raisestep=1e-9
READ(234,*)WAVE !,WAVESTEP
READ(234,*)RAMP,RAMPSTEP !Most commonly used value is: Ramp=1e-6, Rampstep=1e-9
READ(234,*)TIMESTEP !Most commonly used value is 1e-7
READ(234,*)AMP !It denotes the value of amplitude of transmitting source.
read(234,*)NumRecHeights !It is determined by your recording configuration
allocate(FlightHeight(NumRecHeights),GridNumHeight(NumRecHeights),Nzs_Air(NumRecHeights))
READ(234,*)(FlightHeight(iii),iii=1,NumRecHeights)
READ(234,'(a12)')SOURCE_TYPE !Currently the only possible value of Source_type is 'TIXING_UPCOS'
read(234,'(a2)')RecFlag !Possible values are 'HE' and 'Hz'
READ(234,*)NumRecLines
read(234,*)RecPointMin,RecPointMax
NumRecPoints=RecPointMax-RecPointMin+1
IF(NumRecLines .EQ. 0)THEN
WRITE(10005,*)'没有设置额外的接收点,程序继续运行!'
ELSEIF(NumRecLines .GT. 0)THEN
ALLOCATE(RecLine(NumRecLines),RecPoint(NumRecPoints))
ELSE
WRITE(10005,*)'额外接收点设置错误,请参阅输入数据文件格式说明,程序异常终止!'
STOP
ENDIF
CLOSE(234)
ENDIF
do iii=1,NumRecHeights
GridNumHeight(iii)=FlightHeight(iii)/GridSize
end do
do iii=1,NumRecPoints,1
RecPoint(iii)=iii+RecPointMin-1
end do
!计算CONSTANTPARAMETERS中的其他常数
NXB=NX+1
NYB=NY+1
NZB=NZ+1
NXS=NX/2+1
NYS=NY/2+1
NZS=NZ/2
do iii=1,NumRecHeights
NZS_AIR(iii)=NZS-GridNumHeight(iii)
end do
do iii=1,NumRecLines,1
RecLine(iii)=nxs-(NumRecLines-1)/2+iii-1
end do
!将电流转换成电流密度
AMP=AMP/(GridSize*GridSize)
SourceGridNum=int(SourceLength/GridSize)
ALLOCATE(SOURCE(NSTOP))
ENDSUBROUTINE GETDATA

查看文件

@@ -0,0 +1,36 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!this subroutine is writen by Huaifeng Sun from May 29, 2017
subroutine getxmldata
use constantparameters
use ifport
implicit none
logical alive
integer temp_ii,iii
!this following lines 10-21 are added by huaifeng sun to get the dir 2016-10-30
character(255) dir
character(255) inputfilename
integer(4) length
length = getdrivedirqq(dir)
if (length .gt. 0) then
inputfilename=trim(dir)//'//example//input.dat'
else
write (*,*) 'failed to get current directory'
pause
end if
!the following inputfilename type are modified by hfsun 2016-10-30
inquire(file=inputfilename, exist=alive)
if(.not. alive) then
write(10005,*) "input.dat does not exist."
write (*,*)"input.dat does not exist."
pause
else
!the following starts to read the xml data file.
endif
endsubroutine getxmldata

查看文件

@@ -0,0 +1,28 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE MEMORY_USE_ESTIMATION
!This subroutine is written by Huaifeng Sun, and it has not been modified since the last ice age, so it can not reveal the real consumption of memory now.
! This subroutine needs further modification. You can, you do!
USE CONSTANTPARAMETERS
IMPLICIT NONE
INTEGER(KIND=8) TUSE
CHARACTER(LEN=40) XSTRING
INTEGER(KIND=1) CONTD
TUSE=0.0
TUSE=TUSE+NX*NYB*NZB+NXB*NY*NZB+NXB*NYB*NZ !<21>糡Eʹ<45><CAB9><EFBFBD>ڴ<EFBFBD>
TUSE=TUSE+NXB*NY*(NZ+1)+NX*NYB*(NZ+1)+NX*NY*NZB !<21>ų<EFBFBD>Hʹ<48><CAB9><EFBFBD>ڴ<EFBFBD>
TUSE=TUSE+4*NY*NZB+4*NYB*NZ+NX*4*NZB+NXB*4*NZ+NX*NYB*4+NXB*NY*4 !<21>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ڴ<EFBFBD>
TUSE=TUSE+4*NY*NZB+4*NYB*NZ+NX*4*NZB+NXB*4*NZ+NX*NYB*4+NXB*NY*4 !<21>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ڴ<EFBFBD>
TUSE=TUSE+NXB*NYB*NZB <><C4A3>ʹ<EFBFBD><CAB9><EFBFBD>ڴ<EFBFBD>
TUSE=TUSE+NSTOP*2
TUSE=TUSE/1024
TUSE=TUSE/1024
TUSE=TUSE*16
WRITE (XSTRING,'(I40)') TUSE
XSTRING = 'At least '//TRIM(ADJUSTL(XSTRING))//'M memory is needed!' <><C6B4>ΪҪ<CEAA><D2AA><EFBFBD><EFBFBD>FORMAT<41><54>ʽ
XSTRING = TRIM(ADJUSTL(XSTRING))
WRITE(*,*)XSTRING
RETURN
ENDSUBROUTINE MEMORY_USE_ESTIMATION

查看文件

@@ -0,0 +1,34 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE RES_CONFIGURE
!<21><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>͵ĵ<CDB5><C4B5><EFBFBD><EFBFBD>ʲ<EFBFBD><CAB2><EFBFBD>
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
USE OMP_LIB
IMPLICIT NONE
INTEGER II,III,i,j,k
DO K=1,NZ
DO J=1,NY
DO I=1,NX
CCSIG(I,J,K)=BACKGROUND_CONDUCTIVITY !Set the background value of conductivity.
ENDDO
ENDDO
ENDDO
II=SIZE(TAR_X1)
DO III=1,II
DO K=TAR_Z1(III),TAR_Z2(III)
DO J=TAR_Y1(III),TAR_Y2(III)
DO I=TAR_X1(III),TAR_X2(III)
CCSIG(I,J,K)=TAR_CONDUCTIVITY(III) !Set the value of anomalous conductivity.
ENDDO
ENDDO
ENDDO
ENDDO
SIGMA_MIN=MINVAL(CCSIG)
RETURN
ENDSUBROUTINE RES_CONFIGURE
!------------------------

查看文件

@@ -0,0 +1,30 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE SIN_SOURCE
USE CONSTANTPARAMETERS
USE TIME_PARAMETER
USE OMP_LIB
IMPLICIT NONE
integer i,j,k
DELT=1.0D-7
CTIME(1)=0.0D0
SOURCE(1)=0.0D0
DO I=2,NSTOP
CTIME(I)=CTIME(I-1)+DELT(I-1)
IF(CTIME(I) .LT. WAVE)THEN
SOURCE(I)=AMP*SIN(PI*CTIME(I)/WAVE)
ELSE
SOURCE(I)=0.0D0
ENDIF
ENDDO
OPEN(9,FILE='CTIME_SIN_SOURCE.DAT',STATUS='UNKNOWN')
DO I=1,NSTOP
WRITE(9,'(3E24.16)')CTIME(I),DELT(I),SOURCE(I)
ENDDO
CLOSE(9)
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD><E4B2A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>CTIME_SIN_SOURCE.DAT'
RETURN
ENDSUBROUTINE SIN_SOURCE

查看文件

@@ -0,0 +1,69 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE TIME_SERIOUS
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
USE OMP_LIB
!<21><><EFBFBD>ӳ<EFBFBD><D3B3>򽫼<EFBFBD><F2BDABBC><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
IMPLICIT NONE
INTEGER NSTOP_TEMP,i,j,k
TIME_MAX=100*GridSize*SQRT(EPS0*MU0/3.0) !Time_max can be set to larger value if the value of GridSize if less than 1m, otherwise you will spend a much longer time in calculation.
!GENERATE THE TOTAL TIME WHEN THE TIME STEP CHANGES FROM RAMPSTEP TO WAVESTEP(TIME_MAX)
TIME_RAMP2WAVE_SUM=RAMPSTEP
TIME_RAMP2WAVE_TEMP=RAMPSTEP
DO WHILE(TIME_RAMP2WAVE_TEMP .LT. TIME_MAX)
TIME_RAMP2WAVE_SUM=TIME_RAMP2WAVE_SUM+TIME_RAMP2WAVE_TEMP
TIME_RAMP2WAVE_TEMP=TIME_RAMP2WAVE_TEMP*1.0005
ENDDO
if(time_ramp2wave_sum.ge.wave/2.0d0)then
time_ramp2wave_sum=wave/2.0d0
end if
SELECT CASE (SOURCE_TYPE)
CASE('TIXING_RAMP')
CALL TIXING_SOURCE
CASE('TIXING_UPCOS') !Currently, this is the only possibility in input.dat file, so that you are surpposed to only take a look at this subroutine among the four.
CALL TIXING_SOURCE_UPCOS
CASE('HALF_SIN')
CALL SIN_SOURCE
CASE('TRIANGLE')
CALL TRIANGLE_SOURCE
CASE DEFAULT
WRITE(*,*)'SOURCE TYPE INPUT ERROR'
ENDSELECT
MAX_OFF_TIME=MAX_OFF_TIME*1.0D-3 !The unit of Max_off_time in input.dat should be ms, and here the value is transformed into s
DO I=1,NSTOP
IF(CTIME(I) .LE. MAX_OFF_TIME)THEN
NSTOP_TEMP=I+1
ENDIF
ENDDO !This subroutine computes the value of Nstop which satisfies the requirement of Max_off_time
IF(NSTOP_TEMP .LT. NSTOP)THEN
NSTOP=NSTOP_TEMP !Change the value of Nstop to a smaller value according to the above computation
WRITE(10005,*)'NSTOP<4F>ı<EFBFBD>Ϊ',NSTOP
OPEN(9,FILE='CTIME_TIXING_UPCOS.DAT',STATUS='UNKNOWN')
DO I=1,NSTOP
WRITE(9,'(3E24.16)')CTIME(I),DELT(I),SOURCE(I)
ENDDO
CLOSE(9)
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><E4B2A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>CTIME_TIXING_UPCOS.DAT'
ELSEIF(NSTOP_TEMP .EQ. NSTOP)THEN
NSTOP=NSTOP_TEMP
WRITE(10005,*)'NSTOPû<50>иı<C4B1><E4A3AC><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NSTOP.'
OPEN(9,FILE='CTIME_TIXING_UPCOS.DAT',STATUS='UNKNOWN')
DO I=1,NSTOP
WRITE(9,'(3E24.16)')CTIME(I),DELT(I),SOURCE(I)
ENDDO
CLOSE(9)
WRITE(10005,*)'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD>Һ<EFBFBD><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><E4B2A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>CTIME_TIXING_UPCOS.DAT'
ELSE
WRITE(10005,*)'The number of iteration steps exceeds the range given in the input.dat, please change it. now the Nstop value is determined by Max_off_time.'
print*,'The number of iteration steps exceeds the range given in the input.dat, please change it. now the Nstop value is determined by Max_off_time.'
print*,'I give you a pause here, you should decide to continue or to quit'
pause
Nstop=Nstop_temp
ENDIF
RETURN
ENDSUBROUTINE TIME_SERIOUS

查看文件

@@ -0,0 +1,55 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
!<21><><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF>غ<EFBFBD><D8BA><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF>غ<EFBFBD><D8BA><EFBFBD>
SUBROUTINE TIXING_SOURCE_UPCOS
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
USE OMP_LIB
IMPLICIT NONE
REAL(KIND=8)T0
integer i,j,k
WAVESTEP=TIME_MAX !Time_max is given in Time_series subroutine: TIME_MAX=GridSize*SQRT(EPS0*MU0/3.0)
T0=1.13*MU0*SIGMA_MIN*GridSize*GridSize
CTIME(1)=0.0D0 !RAISESTEP !RAISETIME/STEP !1.13*MU0*DELX*DELX/RES(1,1,1)
DELT(1)=RAISESTEP !RAISETIME/STEP
DELT(0)=DELT(1)
SOURCE(1)=AMP*0.5*(1-COS(PI*CTIME(1)/RAISETIME)) !AMP*CTIME(1)/RAISETIME
DO I=2,NSTOP
CTIME(I)=CTIME(I-1)+DELT(I-1)
IF(CTIME(I) .LT. RAISETIME)THEN
DELT(I)=RAISESTEP
SOURCE(I)=AMP*0.5*(1-COS(PI*CTIME(I)/RAISETIME)) !AMP*CTIME(I)/RAISETIME
ELSEIF(CTIME(I) .GE. RAISETIME .AND. CTIME(I) .LT. RAISETIME+WAVE-TIME_RAMP2WAVE_SUM)THEN
DELT(I)=DELT(I-1)*1.0005
IF(DELT(I) .GE. WAVESTEP)THEN
DELT(I)=WAVESTEP
ENDIF
SOURCE(I)=AMP !1.0D0
ELSEIF(CTIME(I) .GE. RAISETIME+WAVE-TIME_RAMP2WAVE_SUM .AND. CTIME(I) .LT. RAISETIME+WAVE)THEN
DELT(I)=DELT(I-1)*0.9995
IF(DELT(I) .LE. RAMPSTEP)THEN
DELT(I)=RAMPSTEP
ENDIF
SOURCE(I)=AMP
ELSEIF(CTIME(I) .GE. RAISETIME+WAVE .AND. CTIME(I) .LT. RAISETIME+WAVE+RAMP)THEN
DELT(I)=RAMPSTEP
SOURCE(I)=AMP-AMP*0.5*(1-COS(PI*(CTIME(I)-RAISETIME-WAVE)/RAMP)) !+AMP*(+RAMP)/RAMP !-AMP*CTIME(I)/RAMP+AMP*(RAISETIME+WAVE+RAMP)/RAMP
ELSEIF(CTIME(I) .LT. RAISETIME+WAVE+RAMP+T0)THEN
DELT(I)=RAMPSTEP
SOURCE(I)=0.0D0
ELSE
DELT(I)=0.1*GridSize*SQRT(MU0*SIGMA_MIN*(CTIME(I)-RAISETIME-WAVE-RAMP)/6.0D0) !This can be changed if the value of GridSize is less than 1m.
SOURCE(I)=0.0D0
IF(DELT(I) .GT. 2.0D-7)THEN
DELT(I)=2.0D-7 !1.0D-9 !
ELSEIF(DELT(I) .LT. RAMPSTEP)THEN
DELT(I)=RAMPSTEP
ENDIF
ENDIF
ENDDO
RETURN
ENDSUBROUTINE TIXING_SOURCE_UPCOS

查看文件

@@ -0,0 +1,52 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE TIXING_SOURCE
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
USE OMP_LIB
IMPLICIT NONE
integer i,j,k
CTIME(1)=0.0D0 !RAISESTEP !RAISETIME/STEP !1.13*MU0*DELX*DELX/RES(1,1,1)
DELT(1)=RAISESTEP !RAISETIME/STEP
DELT(0)=DELT(1)
SOURCE(1)=AMP*CTIME(1)/RAISETIME
DO I=2,NSTOP
CTIME(I)=CTIME(I-1)+DELT(I-1)
IF(CTIME(I) .LT. RAISETIME)THEN
DELT(I)=RAISESTEP
SOURCE(I)=AMP*CTIME(I)/RAISETIME
ELSEIF(CTIME(I) .GE. RAISETIME .AND. CTIME(I) .LT. RAISETIME+WAVE-1.0D-6)THEN
DELT(I)=DELT(I-1)*1.10D0
IF(DELT(I) .GE. WAVESTEP)THEN
DELT(I)=WAVESTEP
ENDIF
SOURCE(I)=AMP !1.0D0
ELSEIF(CTIME(I) .GE. RAISETIME+WAVE-1.0D-6 .AND. CTIME(I) .LT. RAISETIME+WAVE)THEN
DELT(I)=DELT(I-1)*0.90D0
IF(DELT(I) .LE. RAMPSTEP)THEN
DELT(I)=RAMPSTEP
ENDIF
SOURCE(I)=AMP
ELSEIF(CTIME(I) .GE. RAISETIME+WAVE .AND. CTIME(I) .LT. RAISETIME+WAVE+RAMP)THEN
DELT(I)=RAMPSTEP
SOURCE(I)=-AMP*CTIME(I)/RAMP+AMP*(RAISETIME+WAVE+RAMP)/RAMP
ELSE
DELT(I)=0.1*GridSize*SQRT(MU0*SIGMA_MIN*(CTIME(I)-RAISETIME-WAVE-RAMP)/6)
SOURCE(I)=0.0D0
IF(DELT(I) .GT. 4.0D-7)THEN
DELT(I)=4.0D-7
ENDIF
ENDIF
ENDDO
OPEN(9,FILE='CTIME_TIXING.DAT',STATUS='UNKNOWN')
DO I=1,NSTOP
WRITE(9,'(3E24.16E3)')CTIME(I),DELT(I),SOURCE(I)
ENDDO
CLOSE(9)
WRITE(10005,*)'<27><><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><E4B2A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>CTIME_TIXING.DAT'
RETURN
ENDSUBROUTINE TIXING_SOURCE

查看文件

@@ -0,0 +1,31 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE TRIANGLE_SOURCE
USE CONSTANTPARAMETERS
USE TIME_PARAMETER
USE OMP_LIB
IMPLICIT NONE
integer i,j,k
DELT=1.0D-7
CTIME(1)=0.0D0
SOURCE(1)=0.0D0
DO I=2,NSTOP
CTIME(I)=CTIME(I-1)+DELT(I-1)
IF(CTIME(I) .LT. WAVE/2.0D0)THEN
SOURCE(I)=2*AMP*CTIME(I)/WAVE
ELSEIF (CTIME(I) .GE. WAVE/2.0D0 .AND. CTIME(I) .LE. WAVE) THEN
SOURCE(I)=-2*AMP*CTIME(I)/WAVE+2*AMP
ELSE
SOURCE(I)=0.0D0
ENDIF
ENDDO
OPEN(9,FILE='CTIME_TRIANGLE_SOURCE.DAT',STATUS='UNKNOWN')
DO I=1,NSTOP
WRITE(9,'(3E24.16)')CTIME(I),DELT(I),SOURCE(I)
ENDDO
CLOSE(9)
WRITE(10005,*)'<27><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><E4B2A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>ļ<EFBFBD>CTIME_TRIANGLE_SOURCE.DAT'
RETURN
ENDSUBROUTINE TRIANGLE_SOURCE

查看文件

@@ -0,0 +1,17 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
subroutine WriteRecFiles(num)
use constantparameters
use electromagnetic_variables
use time_parameter
implicit none
integer ii,jj,num
select case(RecFlag)
case('Hz')
call SubWriteRecFiles('Hz',num)
case('HE')
call SubWriteRecFiles('HE',num)
end select
end subroutine WriteRecFiles

21
tem3dfdtd/lib/zero.f90 普通文件
查看文件

@@ -0,0 +1,21 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
SUBROUTINE ZERO
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
USE OMP_LIB
!<21><><EFBFBD>ӳ<EFBFBD><D3B3>򽫼<EFBFBD><F2BDABBC><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>鸳0ֵ<30><D6B5><EFBFBD>г<EFBFBD>ʼ<EFBFBD><CABC>
IMPLICIT NONE
CCSIG=0.0D0
EX=0.0D0
EY=0.0D0
EZ=0.0D0
HX=0.0D0
HY=0.0D0
HZ=0.0D0
RETURN
ENDSUBROUTINE ZERO

61
tem3dfdtd/main.f90 普通文件
查看文件

@@ -0,0 +1,61 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
! This is a finite difference time domain (FDTD) code for the simulation of transient electromagnetic (TEM);
! This code is designed to be used in semi_airborne TEM with a loop source;
! This code is written by Huaifeng Sun (sunhuaifeng@gmail.com) and Xushan Lu (luxushan@gmail.com);
! OpenACC API is used in this code for the acceleration with GPU device; therefore, you are recommended to compile this code with --
! --PGI Accelerator Fortran Workstation compiler. A Nvidia GPU card with CUDA capability is required if you want to run this code in parallel mode.
! Nobody is allowed to copy or distribute this code to people outside of TDEM.org group without the permission from Prof. Xiu Li (lixiu@chd.edu.cn)--
! --or you will be
! Contact the author for more detailed information.
!------------------------------------------------Instruction part--------------------------------------------------!
! This module is used to declare most of the parameters which are used in the entire code.
!-----------------------------------------------------------------------------------------------------------------------!
!==========================<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ==============================
PROGRAM MAIN
USE OMP_LIB
USE CONSTANTPARAMETERS
USE ELECTROMAGNETIC_VARIABLES
USE RES_MODEL_PARAMETER
USE TIME_PARAMETER
IMPLICIT none
CHARACTER*20, XSTRING
CHARACTER*20, SYS_TIME
OPEN(10005,FILE='logfile.log',STATUS='UNKNOWN')
CALL GET_SYS_TIMEDATA(SYS_TIME)
WRITE(10005,*)'----------------------',SYS_TIME,'----------------------'
CALL GETDATA !This subroutine is used to input all the needed parameter of each calculation from 'input.dat' file.
CALL CHECKPARAMETERS !This subroutine is used to chech the correctness of input
WRITE (XSTRING,'(I3)') NX
XSTRING = '('//TRIM(ADJUSTL(XSTRING))//'E28.16E3)'
XSTRING = TRIM(ADJUSTL(XSTRING))
CALL MEMORY_USE_ESTIMATION !This subroutine is used to estimate the total memory usage according to the input,
CALL ALLOCATEMEMORY !This subroutine is used to allocate the memory in Host.
WRITE(*,*)'Preparing the non-uniform grid.. .. .. ..'
CALL GET_NON_UNIFORMGRID !This subroutine is used to mesh the non-uniform grid model.
WRITE(*,*)'Initializing the parameters.. .. ..'
CALL ZERO !This subroutine is used to initialize the value of array.
WRITE(*,*)'Creating resistivity model.. .. ..'
CALL RES_CONFIGURE !This subroutine is used to distribute the resistivity (or conductivity) of the geology model to each grid
WRITE(*,*)'Creating computing time series.. .. ..'
CALL TIME_SERIOUS !This subroutine is used to creat the time series of the entire computation
WRITE(*,*)'Preparing array receiver points.. .. ..'
WRITE(*,*)'Starting computing.. .. ..'
CALL GET_SYS_TIMEDATA(SYS_TIME)
WRITE(10005,*)'----------------------',SYS_TIME,'----------------------'
call Get_eps_r !This subroutine is used to get the fictitious dielectric constant
call Get_mstop !This subroutine is used to cut the entire computation process into computation fractions
call GetSourcePosition !This subroutine is used to get the source position in the model.
call OpenRecFiles !This subroutine is used to open all the files for the record of simulation data.
call Iteration !This subroutine is the iteration subroutine of EM filed
call CloseRecFiles !This subroutine is used to close all the opened recording files
CALL FREE_MEMORY !This subroutine is used to deallocate all the memory allocated before iteration
CALL GET_SYS_TIMEDATA(SYS_TIME)
WRITE(10005,*)'----------------------',SYS_TIME,'----------------------'
WRITE(10005,*)'Computation finished<65><64>'
CLOSE(10005)
END PROGRAM MAIN

查看文件

@@ -0,0 +1,70 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
MODULE CONSTANTPARAMETERS
INTEGER NX,NY,NZ
! Nx,Ny,Nz is the number of grid in x, y and z directions respectively;
REAL*8 SourceLength ! The length of source
INTEGER SourceGridNum ! The number of grids in source area (x direction)
INTEGER NXB,NYB,NZB !Nxb=Nx+1, Nyb=Ny+1, Nzb=Nz+1
INTEGER NXS,NYS,NZS !This parameter mostly represents the middle grid's number, Nxs=Nx/2 or Nxs=Nxb/2, Nys=Ny/2 or Nys=Nyb/2, Nzs=Nz/2
REAL*8 BACKGROUND_CONDUCTIVITY,TUNNEL_LENGTH !The conductivity of background; the length of tunnel
CHARACTER*8 CAL_TYPE !The type of Calculation, in this case, it is semi which represents semi_airborne
REAL*8 SIGMA_MIN !The minimum value of sigma
REAL(KIND=8) TIME_MAX !The maximum value of iteration time step
INTEGER NSTOP !The number of total iteration steps
REAL*8 MAX_OFF_TIME !The maximum calculation time, in ms
INTEGER LOOP !Iteration step
REAL*8, PARAMETER:: CC=2.99792458D8 !The velocity of light
REAL*8, PARAMETER:: PI=3.141592653589793238462643383276D0 !PI
REAL*8, PARAMETER:: SCALE_PAR=1.05d0 !The ratio of adjacent grid's length
REAL*8, PARAMETER:: MAX_RATIO=50.0D0 !The maximum value of scale_par
REAL*8 GridSize !The size of a single grid, it represents the size of uniform grid.
REAL(KIND=8), DIMENSION(:),ALLOCATABLE:: CDELX !The array of all grid size in x direction, designed for the recording of ununiform meshing.
REAL(KIND=8), DIMENSION(:),ALLOCATABLE:: CDELY !The array of all grid size in y direction, designed for the recording of ununiform meshing.
REAL(KIND=8), DIMENSION(:),ALLOCATABLE:: CDELZ !The array of all grid size in z direction, designed for the recording of ununiform meshing.
integer::mstop(100000),mstart(100000),num_fra_com !
! The entire computation process is cut into hundreds of computing fractions. At the begining of each computation fraction, data is sent to GPU--
! --device, then the computation of this section starts in device, and the data is sent back to host when the comutation is finished in device-------
! --then we record electromagnetic field value to the hard disk. This procedure keeps running until the end of the entire computation.
! mstop is an array used to store the iteration steps in a section, the length is set to 10000 because we can not know the number of sections at--
! --the beginning of computation and it's value usually is smaller than 10000. Thus you should change it when there are more than 10000 computation--
! --fractions in some certain computing task.
! mstart is used to store the value of the beginning iteration step number of the entire iteration process. It has the same length with mstop.
! num_fra_com is the number of computation fractions of the entire computation process.
REAL*8, PARAMETER:: MU0=4.0*PI*1.0D-7 !The permeability of vaccum.
REAL*8, PARAMETER:: EPS0=1.0/(CC*CC*MU0) !The dielectric constant of vaccum.
CHARACTER(LEN=20) SOURCE_TYPE !The type of source, most commonly used one is tixing_upcos.
character*30,allocatable::RecHzFile(:,:),RecHEFile(:,:),RecFile(:,:) !The filename of Recording file, RecHzFile for the Hz mode which only record the value of Hz--
! --RecHEFile for HE mode which record every component of electromagnetic filed, RecFile is used in the filename distribution process.
character*30 PostProcessFile,SplitFile !The filename of PostProcessFileList.dat which stores the name of files need to be post processed.
character*2 RecFlag !Recording mode flag, possible values are: Hz and HE. It is specified in input.dat file.
integer,allocatable::RecHzFilePid(:,:),RecHEFilePid(:,:),RecFilePid(:,:) !File pid of RecHzFile, RecHeFile and RecFile.
integer PostProcessFilePid,SplitFilePid !The pid of PostProcessFileList.dat
Integer,Allocatable::is_ex_in_source(:,:)
!An array used in GetSourcePosition subroutine, the dimension of it is (Nx,Ny), in the source area, the value of this array is 1, else it is 0.
integer,allocatable::is_ey_in_source(:,:)
!The same as above.
integer RecPointMin,RecPointMax
integer,allocatable::RecLine(:),RecPoint(:)
!Two dimensional array which stores the value of grid number as (x,y) at which the value of EM filed need to be recorded.
integer,allocatable::FlightHeight(:) !This is the flight height of semi_airborne TEM or you can see it as the height of recording plane.
character*3,allocatable::Height(:) !This is used in the filename distribution process
INTEGER,allocatable:: GridNumHeight(:) !The number of grids between flight height plane and ground in z direction.
INTEGER,allocatable:: NZS_AIR(:) !The grid number in z direction of flight height plane
INTEGER NumRecLines,NumRecPoints,NumRecHeights !The number of total recording points and recording heights
REAL(KIND=8), DIMENSION(:), ALLOCATABLE:: SOURCE !Nstop length array which stores the value of amplitude of source.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_X1 !The left grid number of anomalous body in x direction.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_X2 !The right grid number of anomalous body in x direction.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_Y1 !The left grid number of anomalous body in y direction.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_Y2 !The right grid number of anomalous body in y direction.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_Z1 !The left grid number of anomalous body in z direction.
INTEGER, DIMENSION(:), ALLOCATABLE:: TAR_Z2 !The right grid number of anomalous body in z direction.
REAL(KIND=8), DIMENSION(:), ALLOCATABLE:: TAR_CONDUCTIVITY !The conductivity array of anomalous body
real*8,allocatable::Eps_r(:),Cq(:) !Nstop length array of fictitious dielectric constant; cq is a middle variable used in the iteration part.
REAL*8 RAISETIME,RAMP,WAVE,AMP !The time of raising edge, ramp edge and duration in trapezoidal waveform, amp is the amplitude of source
REAL*8 RAISESTEP,WAVESTEP,RAMPSTEP,TIMESTEP
! The iteration time step in raise, duration, ramp and cutoff period.
real*8,allocatable::Coordix3(:),Coordiy3(:),Coordiz3(:) !This is used to store the coordination of each grid in x,y and z direction.
ENDMODULE CONSTANTPARAMETERS

查看文件

@@ -0,0 +1,8 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
MODULE ELECTROMAGNETIC_VARIABLES
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE:: EX,EY,EZ !The x,y and z component of electric field in 3 dimensions
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE:: HX,HY,HZ !The x,y and z component of magnetic field in 3 dimensions
ENDMODULE ELECTROMAGNETIC_VARIABLES

查看文件

@@ -0,0 +1,7 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
MODULE RES_MODEL_PARAMETER
REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE:: CCSIG !The conductivity in each grid
ENDMODULE RES_MODEL_PARAMETER

查看文件

@@ -0,0 +1,11 @@
!Copyright (c) 2013 by tdem.org under guide of Xiu Li(lixiu@chd.edu.cn)
!written by Huaifeng Sun(sunhuaifeng@gmail.com) and Xushan Lu(luxushan@gmail.com)
!Code distribution @ tdem.org or sunhuaifeng.com
MODULE TIME_PARAMETER
REAL(KIND=8), DIMENSION(:), ALLOCATABLE:: CTIME,DELT
!Ctime is a Nstop length array which stores the value of time of each iteration step
! Delt is a Nstop length array which stores the value of iteration time step.
REAL TIME_RAMP2WAVE_SUM,TIME_RAMP2WAVE_TEMP
! This is used in Time_series subroutine.
ENDMODULE TIME_PARAMETER

查看文件

@@ -0,0 +1 @@
this folder is used to store the calculated data!

95
tem3dfdtd/tem3dfdtd.vfproj 普通文件
查看文件

@@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject ProjectCreator="Intel Fortran" Keyword="Console Application" Version="11.0" ProjectIdGuid="{94A7F592-24DB-4139-B709-699C1B4A8B1A}">
<Platforms>
<Platform Name="Win32"/>
<Platform Name="x64"/></Platforms>
<Configurations>
<Configuration Name="Debug|Win32">
<Tool Name="VFFortranCompilerTool" SuppressStartupBanner="true" DebugInformationFormat="debugEnabled" Optimization="optimizeDisabled" WarnInterfaces="true" Traceback="true" BoundsCheck="true" StackFrameCheck="true" RuntimeLibrary="rtMultiThreadedDebugDLL"/>
<Tool Name="VFLinkerTool" LinkIncremental="linkIncrementalNo" SuppressStartupBanner="true" GenerateDebugInformation="true" SubSystem="subSystemConsole"/>
<Tool Name="VFResourceCompilerTool"/>
<Tool Name="VFMidlTool" SuppressStartupBanner="true"/>
<Tool Name="VFCustomBuildTool"/>
<Tool Name="VFPreLinkEventTool"/>
<Tool Name="VFPreBuildEventTool"/>
<Tool Name="VFPostBuildEventTool"/>
<Tool Name="VFManifestTool" SuppressStartupBanner="true"/></Configuration>
<Configuration Name="Release|Win32">
<Tool Name="VFFortranCompilerTool" SuppressStartupBanner="true" RuntimeLibrary="rtMultiThreadedDLL"/>
<Tool Name="VFLinkerTool" LinkIncremental="linkIncrementalNo" SuppressStartupBanner="true" SubSystem="subSystemConsole"/>
<Tool Name="VFResourceCompilerTool"/>
<Tool Name="VFMidlTool" SuppressStartupBanner="true"/>
<Tool Name="VFCustomBuildTool"/>
<Tool Name="VFPreLinkEventTool"/>
<Tool Name="VFPreBuildEventTool"/>
<Tool Name="VFPostBuildEventTool"/>
<Tool Name="VFManifestTool" SuppressStartupBanner="true"/></Configuration>
<Configuration Name="Debug|x64">
<Tool Name="VFFortranCompilerTool" SuppressStartupBanner="true" DebugInformationFormat="debugEnabled" Optimization="optimizeDisabled" WarnInterfaces="true" Traceback="true" BoundsCheck="true" StackFrameCheck="true" RuntimeLibrary="rtMultiThreadedDebugDLL"/>
<Tool Name="VFLinkerTool" LinkIncremental="linkIncrementalNo" SuppressStartupBanner="true" GenerateDebugInformation="true" SubSystem="subSystemConsole"/>
<Tool Name="VFResourceCompilerTool"/>
<Tool Name="VFMidlTool" SuppressStartupBanner="true" TargetEnvironment="midlTargetAMD64"/>
<Tool Name="VFCustomBuildTool"/>
<Tool Name="VFPreLinkEventTool"/>
<Tool Name="VFPreBuildEventTool"/>
<Tool Name="VFPostBuildEventTool"/>
<Tool Name="VFManifestTool" SuppressStartupBanner="true"/></Configuration>
<Configuration Name="Release|x64">
<Tool Name="VFFortranCompilerTool" SuppressStartupBanner="true" RuntimeLibrary="rtMultiThreadedDLL"/>
<Tool Name="VFLinkerTool" LinkIncremental="linkIncrementalNo" SuppressStartupBanner="true" SubSystem="subSystemConsole"/>
<Tool Name="VFResourceCompilerTool"/>
<Tool Name="VFMidlTool" SuppressStartupBanner="true" TargetEnvironment="midlTargetAMD64"/>
<Tool Name="VFCustomBuildTool"/>
<Tool Name="VFPreLinkEventTool"/>
<Tool Name="VFPreBuildEventTool"/>
<Tool Name="VFPostBuildEventTool"/>
<Tool Name="VFManifestTool" SuppressStartupBanner="true"/></Configuration></Configurations>
<Files>
<Filter Name="Header Files" Filter="fi;fd;h;inc"/>
<Filter Name="Resource Files" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"/>
<Filter Name="Source Files" Filter="f90;for;f;fpp;ftn;def;odl;idl">
<Filter Name="doc">
<File RelativePath=".\doc\README.md"/>
<File RelativePath=".\doc\说明书-Chinese.docx"/></Filter>
<Filter Name="example">
<File RelativePath=".\example\input-new.dat"/>
<File RelativePath=".\example\input.dat"/>
<File RelativePath=".\example\input.xml"/>
<File RelativePath=".\example\README.md"/></Filter>
<Filter Name="lib">
<File RelativePath=".\lib\allocatememory.f90"/>
<File RelativePath=".\lib\checkparameters.f90"/>
<File RelativePath=".\lib\close-additional-survey-points-files.f90"/>
<File RelativePath=".\lib\CloseRecFiles.f90"/>
<File RelativePath=".\lib\free-memory.f90"/>
<File RelativePath=".\lib\get-eps-r.f90"/>
<File RelativePath=".\lib\get-mstop.f90"/>
<File RelativePath=".\lib\get-system-timedata.f90"/>
<File RelativePath=".\lib\get_non_uniformgrid.f90"/>
<File RelativePath=".\lib\getdata.f90"/>
<File RelativePath=".\lib\GetSourcePosition.f90"/>
<File RelativePath=".\lib\getxmldata.f90"/>
<File RelativePath=".\lib\Iteration.f90"/>
<File RelativePath=".\lib\memory-use-estimation.f90"/>
<File RelativePath=".\lib\OpenRecFiles.f90"/>
<File RelativePath=".\lib\resistivity-configuration.f90"/>
<File RelativePath=".\lib\sin-source.f90"/>
<File RelativePath=".\lib\SubCloseRecFiles.f90"/>
<File RelativePath=".\lib\SubOpenRecFiles.f90"/>
<File RelativePath=".\lib\SubWriteRecFiles.f90"/>
<File RelativePath=".\lib\time-serious.f90"/>
<File RelativePath=".\lib\tixing-source-upcos.f90"/>
<File RelativePath=".\lib\tixing-source.f90"/>
<File RelativePath=".\lib\triangle-source.f90"/>
<File RelativePath=".\lib\write-rec-files.f90"/>
<File RelativePath=".\lib\zero.f90"/></Filter>
<Filter Name="module">
<File RelativePath=".\module\constant-parameters.f90"/>
<File RelativePath=".\module\electromagnetic-variables.f90"/>
<File RelativePath=".\module\resistivity-model-parameters.f90"/>
<File RelativePath=".\module\time-parameters.f90"/></Filter>
<Filter Name="result">
<File RelativePath=".\result\README.md"/></Filter>
<File RelativePath=".\main.f90"/>
<File RelativePath=".\README.md"/></Filter></Files>
<Globals/></VisualStudioProject>