From 20a8c77b0cd237126bf87ad7c0aff73f089d74dd Mon Sep 17 00:00:00 2001 From: sunhuaifeng Date: Tue, 19 Dec 2023 10:49:54 +0800 Subject: [PATCH] initial --- .gitattributes | 63 +++++ .gitignore | 253 +++++++++++++++++ README.en.md | 34 +-- README.md | 36 +-- tem3dfdtd.sln | 28 ++ tem3dfdtd/README.md | 2 + tem3dfdtd/doc/README.md | 1 + tem3dfdtd/doc/说明书-Chinese.docx | Bin 0 -> 524245 bytes tem3dfdtd/example/README.md | 1 + tem3dfdtd/example/input-new.dat | 64 +++++ tem3dfdtd/example/input.dat | 43 +++ tem3dfdtd/example/input.xml | 99 +++++++ tem3dfdtd/lib/CloseRecFiles.f90 | 20 ++ tem3dfdtd/lib/GetSourcePosition.f90 | 22 ++ tem3dfdtd/lib/Iteration.f90 | 264 ++++++++++++++++++ tem3dfdtd/lib/OpenRecFiles.f90 | 24 ++ tem3dfdtd/lib/SubCloseRecFiles.f90 | 21 ++ tem3dfdtd/lib/SubOpenRecFiles.f90 | 84 ++++++ tem3dfdtd/lib/SubWriteRecFiles.f90 | 82 ++++++ tem3dfdtd/lib/allocatememory.f90 | 37 +++ tem3dfdtd/lib/checkparameters.f90 | 32 +++ .../close-additional-survey-points-files.f90 | 11 + tem3dfdtd/lib/free-memory.f90 | 19 ++ tem3dfdtd/lib/get-eps-r.f90 | 17 ++ tem3dfdtd/lib/get-mstop.f90 | 87 ++++++ tem3dfdtd/lib/get-system-timedata.f90 | 35 +++ tem3dfdtd/lib/get_non_uniformgrid.f90 | 176 ++++++++++++ tem3dfdtd/lib/getdata.f90 | 112 ++++++++ tem3dfdtd/lib/getxmldata.f90 | 36 +++ tem3dfdtd/lib/memory-use-estimation.f90 | 28 ++ tem3dfdtd/lib/resistivity-configuration.f90 | 34 +++ tem3dfdtd/lib/sin-source.f90 | 30 ++ tem3dfdtd/lib/time-serious.f90 | 69 +++++ tem3dfdtd/lib/tixing-source-upcos.f90 | 55 ++++ tem3dfdtd/lib/tixing-source.f90 | 52 ++++ tem3dfdtd/lib/triangle-source.f90 | 31 ++ tem3dfdtd/lib/write-rec-files.f90 | 17 ++ tem3dfdtd/lib/zero.f90 | 21 ++ tem3dfdtd/main.f90 | 61 ++++ tem3dfdtd/module/constant-parameters.f90 | 70 +++++ .../module/electromagnetic-variables.f90 | 8 + .../module/resistivity-model-parameters.f90 | 7 + tem3dfdtd/module/time-parameters.f90 | 11 + tem3dfdtd/result/README.md | 1 + tem3dfdtd/tem3dfdtd.vfproj | 95 +++++++ 45 files changed, 2225 insertions(+), 68 deletions(-) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 tem3dfdtd.sln create mode 100644 tem3dfdtd/README.md create mode 100644 tem3dfdtd/doc/README.md create mode 100644 tem3dfdtd/doc/说明书-Chinese.docx create mode 100644 tem3dfdtd/example/README.md create mode 100644 tem3dfdtd/example/input-new.dat create mode 100644 tem3dfdtd/example/input.dat create mode 100644 tem3dfdtd/example/input.xml create mode 100644 tem3dfdtd/lib/CloseRecFiles.f90 create mode 100644 tem3dfdtd/lib/GetSourcePosition.f90 create mode 100644 tem3dfdtd/lib/Iteration.f90 create mode 100644 tem3dfdtd/lib/OpenRecFiles.f90 create mode 100644 tem3dfdtd/lib/SubCloseRecFiles.f90 create mode 100644 tem3dfdtd/lib/SubOpenRecFiles.f90 create mode 100644 tem3dfdtd/lib/SubWriteRecFiles.f90 create mode 100644 tem3dfdtd/lib/allocatememory.f90 create mode 100644 tem3dfdtd/lib/checkparameters.f90 create mode 100644 tem3dfdtd/lib/close-additional-survey-points-files.f90 create mode 100644 tem3dfdtd/lib/free-memory.f90 create mode 100644 tem3dfdtd/lib/get-eps-r.f90 create mode 100644 tem3dfdtd/lib/get-mstop.f90 create mode 100644 tem3dfdtd/lib/get-system-timedata.f90 create mode 100644 tem3dfdtd/lib/get_non_uniformgrid.f90 create mode 100644 tem3dfdtd/lib/getdata.f90 create mode 100644 tem3dfdtd/lib/getxmldata.f90 create mode 100644 tem3dfdtd/lib/memory-use-estimation.f90 create mode 100644 tem3dfdtd/lib/resistivity-configuration.f90 create mode 100644 tem3dfdtd/lib/sin-source.f90 create mode 100644 tem3dfdtd/lib/time-serious.f90 create mode 100644 tem3dfdtd/lib/tixing-source-upcos.f90 create mode 100644 tem3dfdtd/lib/tixing-source.f90 create mode 100644 tem3dfdtd/lib/triangle-source.f90 create mode 100644 tem3dfdtd/lib/write-rec-files.f90 create mode 100644 tem3dfdtd/lib/zero.f90 create mode 100644 tem3dfdtd/main.f90 create mode 100644 tem3dfdtd/module/constant-parameters.f90 create mode 100644 tem3dfdtd/module/electromagnetic-variables.f90 create mode 100644 tem3dfdtd/module/resistivity-model-parameters.f90 create mode 100644 tem3dfdtd/module/time-parameters.f90 create mode 100644 tem3dfdtd/result/README.md create mode 100644 tem3dfdtd/tem3dfdtd.vfproj diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..add4f4b --- /dev/null +++ b/.gitignore @@ -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 diff --git a/README.en.md b/README.en.md index 2989c50..23578cc 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,4 @@ # tem3dfdtd-open #### 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**} - -#### 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/) +Please visit https://em3d.cn for more information. \ No newline at end of file diff --git a/README.md b/README.md index c3fac81..45f2468 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,5 @@ # tem3dfdtd-open #### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +请访问https://em3d.cn/ 获取更多信息。 -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -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/) diff --git a/tem3dfdtd.sln b/tem3dfdtd.sln new file mode 100644 index 0000000..30b3579 --- /dev/null +++ b/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 diff --git a/tem3dfdtd/README.md b/tem3dfdtd/README.md new file mode 100644 index 0000000..8cb806c --- /dev/null +++ b/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) diff --git a/tem3dfdtd/doc/README.md b/tem3dfdtd/doc/README.md new file mode 100644 index 0000000..136f852 --- /dev/null +++ b/tem3dfdtd/doc/README.md @@ -0,0 +1 @@ +this folder is used to store the doc file! \ No newline at end of file diff --git a/tem3dfdtd/doc/说明书-Chinese.docx b/tem3dfdtd/doc/说明书-Chinese.docx new file mode 100644 index 0000000000000000000000000000000000000000..1236b78cf857a71dbd1ec18693eed0954659171a GIT binary patch literal 524245 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�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≈EoX7BIw1c1PLaX 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 literal 0 HcmV?d00001 diff --git a/tem3dfdtd/example/README.md b/tem3dfdtd/example/README.md new file mode 100644 index 0000000..70fbd8d --- /dev/null +++ b/tem3dfdtd/example/README.md @@ -0,0 +1 @@ +this folder is used to store the examples! \ No newline at end of file diff --git a/tem3dfdtd/example/input-new.dat b/tem3dfdtd/example/input-new.dat new file mode 100644 index 0000000..ece3d62 --- /dev/null +++ b/tem3dfdtd/example/input-new.dat @@ -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 diff --git a/tem3dfdtd/example/input.dat b/tem3dfdtd/example/input.dat new file mode 100644 index 0000000..bb421ad --- /dev/null +++ b/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 diff --git a/tem3dfdtd/example/input.xml b/tem3dfdtd/example/input.xml new file mode 100644 index 0000000..6b9e612 --- /dev/null +++ b/tem3dfdtd/example/input.xml @@ -0,0 +1,99 @@ + + + + + + + SEMI + + + 3 + loop + 1.0 + TIXING_UPCOS + + + 161 + 161 + 160 + 0.5 + + + + + + + + + 2 + 0.5,1 + HE + 1 + 66,96 + + + + 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 + 82,98 + 0.033 + + + + 76,86 + 76,86 + 98,106 + 0.05 + + + + + + + + + + + + + diff --git a/tem3dfdtd/lib/CloseRecFiles.f90 b/tem3dfdtd/lib/CloseRecFiles.f90 new file mode 100644 index 0000000..225627b --- /dev/null +++ b/tem3dfdtd/lib/CloseRecFiles.f90 @@ -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 diff --git a/tem3dfdtd/lib/GetSourcePosition.f90 b/tem3dfdtd/lib/GetSourcePosition.f90 new file mode 100644 index 0000000..48589e6 --- /dev/null +++ b/tem3dfdtd/lib/GetSourcePosition.f90 @@ -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 + diff --git a/tem3dfdtd/lib/Iteration.f90 b/tem3dfdtd/lib/Iteration.f90 new file mode 100644 index 0000000..89642ba --- /dev/null +++ b/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 + diff --git a/tem3dfdtd/lib/OpenRecFiles.f90 b/tem3dfdtd/lib/OpenRecFiles.f90 new file mode 100644 index 0000000..dc0c696 --- /dev/null +++ b/tem3dfdtd/lib/OpenRecFiles.f90 @@ -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 + diff --git a/tem3dfdtd/lib/SubCloseRecFiles.f90 b/tem3dfdtd/lib/SubCloseRecFiles.f90 new file mode 100644 index 0000000..9768c92 --- /dev/null +++ b/tem3dfdtd/lib/SubCloseRecFiles.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 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 diff --git a/tem3dfdtd/lib/SubOpenRecFiles.f90 b/tem3dfdtd/lib/SubOpenRecFiles.f90 new file mode 100644 index 0000000..cd29b4a --- /dev/null +++ b/tem3dfdtd/lib/SubOpenRecFiles.f90 @@ -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 + diff --git a/tem3dfdtd/lib/SubWriteRecFiles.f90 b/tem3dfdtd/lib/SubWriteRecFiles.f90 new file mode 100644 index 0000000..81b1afc --- /dev/null +++ b/tem3dfdtd/lib/SubWriteRecFiles.f90 @@ -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 + + + diff --git a/tem3dfdtd/lib/allocatememory.f90 b/tem3dfdtd/lib/allocatememory.f90 new file mode 100644 index 0000000..b99c865 --- /dev/null +++ b/tem3dfdtd/lib/allocatememory.f90 @@ -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 + !ELECTROMAGNETIC_VARIABLESе + 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) + !RES_MODEL_PARAMETERе + ALLOCATE(CCSIG(NX,NY,NZ), STAT=ERR) + !TIME_PARAMETERе + 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 diff --git a/tem3dfdtd/lib/checkparameters.f90 b/tem3dfdtd/lib/checkparameters.f90 new file mode 100644 index 0000000..59de3d8 --- /dev/null +++ b/tem3dfdtd/lib/checkparameters.f90 @@ -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,*)': ' + WRITE(10005,*)'λ߱߳Ϊ',SourceLength + WRITE(10005,*)'X,Y,ZֱΪ',NX,NY,NZ + WRITE(10005,*)'ȦΪ ',NXS,NYS,NZS + WRITE(10005,*)'Ϊ ',NSTOP + WRITE(10005,*) + WRITE(10005,*)'X,Y,ZСߴֱΪ' + WRITE(10005,*)'DELTA_X=',GridSize + WRITE(10005,*)'DELTA_Y=',GridSize + WRITE(10005,*)'DELTA_Z=',GridSize + WRITE(10005,*)'絼',BACKGROUND_CONDUCTIVITY + WRITE(10005,*) + WRITE(10005,*)'쳣' + 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 diff --git a/tem3dfdtd/lib/close-additional-survey-points-files.f90 b/tem3dfdtd/lib/close-additional-survey-points-files.f90 new file mode 100644 index 0000000..8bd893b --- /dev/null +++ b/tem3dfdtd/lib/close-additional-survey-points-files.f90 @@ -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 diff --git a/tem3dfdtd/lib/free-memory.f90 b/tem3dfdtd/lib/free-memory.f90 new file mode 100644 index 0000000..97346fb --- /dev/null +++ b/tem3dfdtd/lib/free-memory.f90 @@ -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 diff --git a/tem3dfdtd/lib/get-eps-r.f90 b/tem3dfdtd/lib/get-eps-r.f90 new file mode 100644 index 0000000..adab331 --- /dev/null +++ b/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 + + diff --git a/tem3dfdtd/lib/get-mstop.f90 b/tem3dfdtd/lib/get-mstop.f90 new file mode 100644 index 0000000..38e5f66 --- /dev/null +++ b/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 + +!--------------------------------------------------------------------------------------------------! + + diff --git a/tem3dfdtd/lib/get-system-timedata.f90 b/tem3dfdtd/lib/get-system-timedata.f90 new file mode 100644 index 0000000..2420fc1 --- /dev/null +++ b/tem3dfdtd/lib/get-system-timedata.f90 @@ -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 diff --git a/tem3dfdtd/lib/get_non_uniformgrid.f90 b/tem3dfdtd/lib/get_non_uniformgrid.f90 new file mode 100644 index 0000000..a509862 --- /dev/null +++ b/tem3dfdtd/lib/get_non_uniformgrid.f90 @@ -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,*)'õģͳߴΪ' + WRITE(10005,*)'SUM_X=',CDELX_LENGTH + WRITE(10005,*)'SUM_Y=',CDELY_LENGTH + WRITE(10005,*)'SUM_Z=',CDELZ_LENGTH + + WRITE(10005,*)'Ŵϵ=',SCALE_PAR + WRITE(10005,*)'ߴСߴ֮<=',MAX_RATIO + WRITE(10005,*)'XķǾߴΪ' + WRITE(10005,'(5F18.8)')CDELX + + WRITE(10005,*)'YķǾߴΪ' + WRITE(10005,'(5F18.8)')CDELY + WRITE(10005,*)'ZķǾߴΪ' + 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 diff --git a/tem3dfdtd/lib/getdata.f90 b/tem3dfdtd/lib/getdata.f90 new file mode 100644 index 0000000..b51c6be --- /dev/null +++ b/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 diff --git a/tem3dfdtd/lib/getxmldata.f90 b/tem3dfdtd/lib/getxmldata.f90 new file mode 100644 index 0000000..3cb2f22 --- /dev/null +++ b/tem3dfdtd/lib/getxmldata.f90 @@ -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 + \ No newline at end of file diff --git a/tem3dfdtd/lib/memory-use-estimation.f90 b/tem3dfdtd/lib/memory-use-estimation.f90 new file mode 100644 index 0000000..5821978 --- /dev/null +++ b/tem3dfdtd/lib/memory-use-estimation.f90 @@ -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 !糡Eʹڴ + TUSE=TUSE+NXB*NY*(NZ+1)+NX*NYB*(NZ+1)+NX*NY*NZB !ųHʹڴ + TUSE=TUSE+4*NY*NZB+4*NYB*NZ+NX*4*NZB+NXB*4*NZ+NX*NYB*4+NXB*NY*4 !߽ʹڴ + TUSE=TUSE+4*NY*NZB+4*NYB*NZ+NX*4*NZB+NXB*4*NZ+NX*NYB*4+NXB*NY*4 !߽ʹڴ + TUSE=TUSE+NXB*NYB*NZB !ģʹڴ + 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!' !ƴΪҪFORMATʽ + XSTRING = TRIM(ADJUSTL(XSTRING)) + WRITE(*,*)XSTRING + RETURN +ENDSUBROUTINE MEMORY_USE_ESTIMATION diff --git a/tem3dfdtd/lib/resistivity-configuration.f90 b/tem3dfdtd/lib/resistivity-configuration.f90 new file mode 100644 index 0000000..b14fa19 --- /dev/null +++ b/tem3dfdtd/lib/resistivity-configuration.f90 @@ -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 + !ӳģ͵ĵʲ + 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 +!------------------------ diff --git a/tem3dfdtd/lib/sin-source.f90 b/tem3dfdtd/lib/sin-source.f90 new file mode 100644 index 0000000..6bc026c --- /dev/null +++ b/tem3dfdtd/lib/sin-source.f90 @@ -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,*)'ҷ䲨ʱѾдļCTIME_SIN_SOURCE.DAT' + RETURN +ENDSUBROUTINE SIN_SOURCE diff --git a/tem3dfdtd/lib/time-serious.f90 b/tem3dfdtd/lib/time-serious.f90 new file mode 100644 index 0000000..a90250b --- /dev/null +++ b/tem3dfdtd/lib/time-serious.f90 @@ -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 + !ӳ򽫼ʼʱʱ + 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ıΪ',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,*)'ҺͽҺβ䲨ʱѾдļCTIME_TIXING_UPCOS.DAT' + ELSEIF(NSTOP_TEMP .EQ. NSTOP)THEN + NSTOP=NSTOP_TEMP + WRITE(10005,*)'NSTOPûиı䣬޷ʱã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,*)'ҺͽҺβ䲨ʱѾдļ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 \ No newline at end of file diff --git a/tem3dfdtd/lib/tixing-source-upcos.f90 b/tem3dfdtd/lib/tixing-source-upcos.f90 new file mode 100644 index 0000000..2f9bbb5 --- /dev/null +++ b/tem3dfdtd/lib/tixing-source-upcos.f90 @@ -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 + +!βҿغͽҿغ +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 \ No newline at end of file diff --git a/tem3dfdtd/lib/tixing-source.f90 b/tem3dfdtd/lib/tixing-source.f90 new file mode 100644 index 0000000..9109d8b --- /dev/null +++ b/tem3dfdtd/lib/tixing-source.f90 @@ -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,*)'β䲨ʱѾдļCTIME_TIXING.DAT' + RETURN +ENDSUBROUTINE TIXING_SOURCE \ No newline at end of file diff --git a/tem3dfdtd/lib/triangle-source.f90 b/tem3dfdtd/lib/triangle-source.f90 new file mode 100644 index 0000000..9636ba7 --- /dev/null +++ b/tem3dfdtd/lib/triangle-source.f90 @@ -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,*)'Ƿ䲨ʱѾдļCTIME_TRIANGLE_SOURCE.DAT' + RETURN +ENDSUBROUTINE TRIANGLE_SOURCE diff --git a/tem3dfdtd/lib/write-rec-files.f90 b/tem3dfdtd/lib/write-rec-files.f90 new file mode 100644 index 0000000..ca8bc58 --- /dev/null +++ b/tem3dfdtd/lib/write-rec-files.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 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 diff --git a/tem3dfdtd/lib/zero.f90 b/tem3dfdtd/lib/zero.f90 new file mode 100644 index 0000000..3e69231 --- /dev/null +++ b/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 + !ӳ򽫼е鸳0ֵгʼ + 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 \ No newline at end of file diff --git a/tem3dfdtd/main.f90 b/tem3dfdtd/main.f90 new file mode 100644 index 0000000..50f25c0 --- /dev/null +++ b/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. +!-----------------------------------------------------------------------------------------------------------------------! +!==========================ʼ============================== +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' + CLOSE(10005) +END PROGRAM MAIN + diff --git a/tem3dfdtd/module/constant-parameters.f90 b/tem3dfdtd/module/constant-parameters.f90 new file mode 100644 index 0000000..fbf63bb --- /dev/null +++ b/tem3dfdtd/module/constant-parameters.f90 @@ -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 \ No newline at end of file diff --git a/tem3dfdtd/module/electromagnetic-variables.f90 b/tem3dfdtd/module/electromagnetic-variables.f90 new file mode 100644 index 0000000..c73530f --- /dev/null +++ b/tem3dfdtd/module/electromagnetic-variables.f90 @@ -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 \ No newline at end of file diff --git a/tem3dfdtd/module/resistivity-model-parameters.f90 b/tem3dfdtd/module/resistivity-model-parameters.f90 new file mode 100644 index 0000000..15519fb --- /dev/null +++ b/tem3dfdtd/module/resistivity-model-parameters.f90 @@ -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 \ No newline at end of file diff --git a/tem3dfdtd/module/time-parameters.f90 b/tem3dfdtd/module/time-parameters.f90 new file mode 100644 index 0000000..2a9ff68 --- /dev/null +++ b/tem3dfdtd/module/time-parameters.f90 @@ -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 \ No newline at end of file diff --git a/tem3dfdtd/result/README.md b/tem3dfdtd/result/README.md new file mode 100644 index 0000000..37435a2 --- /dev/null +++ b/tem3dfdtd/result/README.md @@ -0,0 +1 @@ +this folder is used to store the calculated data! \ No newline at end of file diff --git a/tem3dfdtd/tem3dfdtd.vfproj b/tem3dfdtd/tem3dfdtd.vfproj new file mode 100644 index 0000000..818e416 --- /dev/null +++ b/tem3dfdtd/tem3dfdtd.vfproj @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +