Commit 0ca72edf authored by Florian Wittkamp's avatar Florian Wittkamp

General cleanup

parent c8024a6d
......@@ -5,7 +5,7 @@ This is a minimalistic version of SOFI3D for the _WAVE_-Project.
**Do not use this version for production!**
SOFI3D stands for Seismic mOdeling with FInite differences and denotes our 3-D viscoelastic time domain massive parallel modeling code.
The manual and a reference paper is included in the download archive or can be downloaded [here](https://git.scc.kit.edu/GPIAG-Software/SOFI3D/wikis/home).
The manual is included in the download archive or can be downloaded [here](https://git.scc.kit.edu/GPIAG-Software/SOFI3D/wikis/home).
## Content
......@@ -13,5 +13,6 @@ The manual and a reference paper is included in the download archive or can be d
- Run scripts etc.: `par/`
- Executable: `bin/`
- Documentation: `doc/` (for full SOFI3D version)
- _WAVE_-Documentation: `par/WAVE_doc/`
See file `par/README.md` to get started.
......@@ -12,3 +12,6 @@ clean-bin:
.PHONY: reinstall
reinstall: clean install
.PHONY: all
all: reinstall
......@@ -45,7 +45,7 @@
\begin{document}
\section*{Von der Wellengleichung zum FD-Schema}
Die Erforschung des Erdkörpers durch die Auswertung von künstlich erzeugten akustischen Wellen bildet den Forschungsschwerpunkt der Seismik. Um ein besseres Verständnis der Wellenausbreitung zu erhalten werden numerische Simulationen durchgeführt. Solche Simulationen können einen wichtigen Dienst bei der Auswertung von Wellenfeldern leisten, sowie genutzt werden um Prozessing-Algorithmen zu testen.\\ \\
Die Erforschung des Erdkörpers durch die Auswertung von künstlich erzeugten akustischen Wellen bildet den Forschungsschwerpunkt der Seismik. Um ein besseres Verständnis der Wellenausbreitung zu erhalten werden numerische Simulationen durchgeführt. Solche Simulationen können einen wichtigen Dienst bei der Auswertung von real gemessenen Wellenfeldern leisten, sowie genutzt werden um Prozessing-Algorithmen zu testen.\\ \\
Eine Methode, mit der sich die Ausbreitung von Wellenfeldern simulieren lässt, ist das weit verbreitete Zeitschrittverfahren der Finiten-Differenzen. Bei diesem Verfahren werden alle benötigten Parameter und Gleichungen auf einem Gitter abgebildet.
\section{Akustische 3-D Wellengleichung}
Um die akustische Wellengleichung mit der Methode der Finiten-Differenzen auf dem geschachtelten Gitter zu lösen, wird die Wellengleichung erster Ordnung benötigt. Die Druck-Geschwindigkeits-Formulierung ('stress-velocity') der akustischen Wellengleichung in 3D ergibt sich nach \citet{virieux1986p} wie folgt:
......@@ -58,7 +58,7 @@ Um die akustische Wellengleichung mit der Methode der Finiten-Differenzen auf de
\end{align}
\end{subequations}
Dabei bezeichnet $v_x$, $v_y$ und $v_z$ die jeweiligen Komponenten der Partikelgeschwindigkeit ($=$ die Geschwindigkeit mit der ein Partikel am Ort $x$ schwingt. $\neq$ Ausbreitungsgeschwindigkeit der Welle), $p$ den Druck, $\varrho$ die Dichte und $M=\lambda$ der Lamé-Parameter.
Für die Geschwindigkeit der akustischen Welle gilt der Zusammenhang \citep{levander}:
Für die Ausbreitungsgeschwindigkeit der akustischen Welle gilt der Zusammenhang \citep{levander}:
\begin{align}
c=\sqrt{\frac{\lambda}{\varrho}}=\sqrt{\frac{M}{\varrho}}\text{.}
\end{align}
......@@ -72,7 +72,7 @@ f(x,y,z,t) = f(i \cdot \Delta x,j \cdot \Delta y,k \cdot \Delta z,n \cdot \Delta
\end{align}
\subsection{Geschachteltes Gitter}
In dieser Arbeit wird ein geschachteltes Gitter ('staggered-grid') verwendet \citep{virieux1986p,levander}. Auf einem solchen Gitter wird der Druck $p$ räumlich auf ganzen Gitterpunkten und zeitlich zwischen zwei Zeitschritten definiert, wohingegen die Geschwindigkeit $v$ auf halben räumlichen Gitterpunkten und zeitlich auf ganzen Zeitschritten approximiert wird. Nach \citet{levander} bietet das geschachtelte Gitter einige Vorteile, wie beispielsweise Stabilität für sämtliche Poisson-Verhältnisse. Darüber hinaus weist das geschachtelte Gitter gegenüber dem nicht geschachtelten Gitter eine erhöhte Genauigkeit bzw. höhere numerische Stabilität auf \citep{liu2009new}. Das verwendete geschachtelte Gitter ist in Abbildung \ref{fig:Gitter} skizziert. \\
Die Dichte $\varrho$ und die Lamé-Parameter $\lambda$ bzw. $\mu$ werden auf ganzen Gitterpunkten abgebildet. Benötigte Materialparameter auf Zwischengitterpunkten werden durch Mittelung errechnet. Nach \cite{bohlen2006accuracy} ist eine Mittelung wesentlich für die Stabilität bei starken Diskontinuitäten (Nicht implementiert in der WAVE-Edition).\\
Die Dichte $\varrho$ und die Lamé-Parameter $\lambda$ bzw. $\mu$ werden auf ganzen Gitterpunkten abgebildet. Benötigte Materialparameter auf Zwischengitterpunkten werden durch Mittelung errechnet. Nach \cite{bohlen2006accuracy} ist eine Mittelung wesentlich für die Stabilität bei starken Diskontinuitäten (Nicht implementiert in der WAVE-Edition, da Materialparameter homogen).\\
Um die bei den Wellengleichungen auftretenden Ableitungen zu approximieren, werden diese durch Differenzengleichungen ersetzt. Bei dem geschachtelten Gitter werden Ableitungen mittels zentraler Differenzengleichung genähert, dies bedeutet die Ableitung wird zwischen zwei Stützstellen ausgewertet. Eine solche Approximation in 1D lässt sich räumlich beziehungsweise zeitlich wie folgt ausdrücken:
\begin{subequations}
\begin{align}
......@@ -133,7 +133,7 @@ Setz man nun die gefunden Finiten-Differenten Ableitungen in die Wellengleichung
p^{n+\frac{1}{2}}_{i,j,k}&=p^{n-\frac{1}{2}}_{i,j,k}-M\cdot\Delta t \left(\frac{{v_x}^n_{i+\frac{1}{2},j,k}-{v_x}^n_{i-\frac{1}{2},j,k}}{\Delta x} +\frac{{v_y}^n_{i,j+\frac{1}{2},k}-{v_y}^n_{i,j-\frac{1}{2},k}}{\Delta y}+\frac{{v_z}^n_{i,j,k+\frac{1}{2}}-{v_z}^n_{i,j,k-\frac{1}{2}}}{\Delta z}\right)
\label{eq:update_p}
\end{align}
Mit diesem expliziten finiten-Differenzen Schemas lässt sich die Wellengleichung in einem Zeitschrittverfahren (Schleife über Zeitschritte) löse und damit Wellenausbreitung simulieren.
Mit diesem expliziten finiten-Differenzen Schemas lässt sich die Wellengleichung in einem Zeitschrittverfahren (Schleife über Zeitschritte) löse und damit Wellenausbreitung simulieren. Die hier gezeigte Approximation zweiter Ordnung ist dabei die einfachste mögliche.
\newpage
\subsection{Implementierung}
......
......@@ -50,7 +50,7 @@ The receivers are located on the diagonal through the 3-D volume as shown in fig
The seismic source is located exactly in the middle of the 3-D volume (see red star, figure \ref{fig:rec_src}). The source is implemented to be a explosive pressure source, thus, the source is injected into the pressure wave field. The source shape correspondents to a Ricker wavelet with a center frequency of 5\,Hz and an amplitude of 5.
\subsection{Run the example}
Before you can run the minimal example you have to install SOFI3D. Switch to the par directory and type make install, which should start the installation. The code should compile without error or compiler warnings.
Before you can run the minimal example you have to install SOFI3D. Switch to the par directory and type make install, which should start the installation. The code should compile without errors or compiler warnings.
Once you installed SOFI3D you can run the script \textit{startSOFI3D\_minimal.sh}. The minimal example is configured to run on eight cores in a few seconds. The configuration parameters are read in from the JSON file which is located in \textit{in\_and\_out/sofi3D.json}. After the simulation is finished you will find the written out seismograms in the folder \textit{par/seismograms}. You can use the provided Matlab or Python scripts to plot the seismograms as a wiggle plot. The seismograms are written out as native floats into binary files.
......
*.jout
\ No newline at end of file
*.jout
*~
\ No newline at end of file
# SOFI3D (_WAVE_-Edition) Input files
At the moment SOFI3D is NOT able to read real JSON files. You have to add a comma to the last entry.
In a standard JSON file the last entry will not have a comma.
## Domain Decomposition
- NPROCX: Number of processors in X
......@@ -36,7 +37,7 @@ In our setting V_MAX is 3500m/s and the density is set to 3000Kg/m3.
The source is always a Ricker-Wavelet, which is injected as an explosive source.
- FC: Center frequency of wavelet
- AMP: Amplitude (most likely in Nm)
- AMP: Amplitude
- XPOS_SOURCE: Position in X direction (in meter)
- YPOS_SOURCE: Position in Y direction (in meter)
- ZPOS_SOURCE: Position in Z direction (in meter)
......
*
\ No newline at end of file
......@@ -11,7 +11,7 @@ close all;
%% Parameter
Traces=61;
Samples=1000;
filename='Seismogram_vx.bin';
filename='Seismogram_p.bin';
%% Read Seismogram
fid=fopen([filename],'r','ieee-le');
......
## plot_seismogram.py
# GNU General Public License v3.0
# Plot seismogram in a wiggle plot
#
# Florian Wittkamp 2016
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?>
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
<storageModule moduleId="org.eclipse.cdt.core.settings">
<cconfiguration id="0.266233798">
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.266233798" moduleId="org.eclipse.cdt.core.settings" name="Default">
<externalSettings/>
<extensions>
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration buildProperties="" description="" id="0.266233798" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
<folderInfo id="0.266233798." name="/" resourcePath="">
<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1877524088" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1877524088.1759258491" name=""/>
<builder id="org.eclipse.cdt.build.core.settings.default.builder.261708955" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.libs.309124360" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
<tool id="org.eclipse.cdt.build.core.settings.holder.1080369736" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.909588808" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.1628142441" name="UPC" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1451608707" languageId="org.eclipse.cdt.core.parser.upc.upc" languageName="UPC" sourceContentType="org.eclipse.cdt.core.parser.upc.upcSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.1021457688" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.783472748" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.556111953" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.821269494" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
<tool id="org.eclipse.cdt.build.core.settings.holder.1907939076" name="Fortran" superClass="org.eclipse.cdt.build.core.settings.holder">
<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2120909093" languageId="org.eclipse.photran.cdtinterface.org.eclipse.photran.cdtinterface.fortran" languageName="Fortran" sourceContentType="org.eclipse.photran.core.fortranSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
</tool>
</toolChain>
</folderInfo>
</configuration>
</storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
</cconfiguration>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<project id="sofi3D.null.648767922" name="sofi3D"/>
</storageModule>
<storageModule moduleId="scannerConfiguration">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
<scannerConfigBuildInfo instanceId="0.266233798">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="0.2044743447">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
<scannerConfigBuildInfo instanceId="0.270750672">
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
</scannerConfigBuildInfo>
</storageModule>
</cproject>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>sofi3D</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
<triggers>clean,full,incremental,</triggers>
<arguments>
<dictionary>
<key>?name?</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.append_environment</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildArguments</key>
<value></value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.buildCommand</key>
<value>make</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
<value>clean</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.contents</key>
<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
<value>false</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.enableFullBuild</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
<value>all</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.stopOnError</key>
<value>true</value>
</dictionary>
<dictionary>
<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
<value>true</value>
</dictionary>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
<triggers>full,incremental,</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
</natures>
</projectDescription>
......@@ -6,6 +6,7 @@ CFLAGS=-Wall -O3
# Recommended: mpiicc
# Maybe LFLAGS=-lm is needed
# Tested with ( OpenMPI && GCC) and ( IntelMPI && ICC )
# after this line, no further editing should be necessary
# --------------------------------------------------------
......@@ -20,7 +21,6 @@ SOFI3D_SRC_ACOUSTIC = \
catseis.c \
initproc.c \
json_parser.c\
merge.c \
note.c \
read_par_json.c \
exchange_par.c \
......
This diff is collapsed.
/*------------------------------------------------------------------------
* Copyright (C) 2016 For the list of authors, see file AUTHORS.
*
* This file is part of SOFI3D.
*
* SOFI3D is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 2.0 of the License only.
*
* SOFI3D is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with SOFI3D. See file COPYING and/or
* <http://www.gnu.org/licenses/gpl-2.0.html>.
--------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
* merge snapshots files written by the different processes to
* a single file
*
* ----------------------------------------------------------------------*/
#include "fd.h"
void merge(int nsnap, int type){
extern char SNAP_FILE[STRING_SIZE];
extern int NXG, NYG, SNAP_FORMAT, NPROCX, NPROCY, NPROCZ;
extern int NX, NY, NZ, IDX, IDY, IDZ;
extern FILE *FP;
char file[STRING_SIZE], mfile[STRING_SIZE], outfile[STRING_SIZE], ext[10];
FILE *fp[NPROCY_MAX][NPROCX_MAX][NPROCZ_MAX], *fpout;
int i, j, k, ip, jp, kp, n;
float a;
if ((NPROCX>NPROCX_MAX)||(NPROCY>NPROCY_MAX)||(NPROCZ>NPROCZ_MAX))
declare_error(" merge.c: constant expression NPROC?_MAX < NPROC? ");
sprintf(ext,".bin");
fprintf(FP," pressure");
strcat(ext,".p");
sprintf(mfile,"%s%s",SNAP_FILE,ext);
fprintf(FP," (files: %s.??? ).\n",mfile);
sprintf(outfile,"%s%s",SNAP_FILE,ext);
fprintf(FP,"\n writing merged snapshot file to %s \n",outfile);
fpout=fopen(outfile,"w");
fprintf(FP," Opening snapshot files: %s.??? ",mfile);
for (kp=0;kp<=NPROCZ-1; kp++)
for (ip=0;ip<=NPROCX-1; ip++)
for (jp=0;jp<=NPROCY-1; jp++){
sprintf(file,"%s.%i%i%i",mfile,ip,jp,kp);
fp[jp][ip][kp]=fopen(file,"r");
if (fp[jp][ip][kp]==NULL) declare_error("merge: can't read snapfile !");
}
fprintf(FP," ... finished. \n");
fprintf(FP," Copying...");
for (n=0;n<=nsnap; n++)
for (kp=0;kp<=NPROCZ-1; kp++)
for (k=1;k<=NZ;k+=IDZ)
for (ip=0;ip<=NPROCX-1; ip++)
for (i=1;i<=NX;i+=IDX)
for (jp=0;jp<=NPROCY-1; jp++)
for (j=1;j<=NY;j+=IDY){
fread(&a, sizeof(float), 1, fp[jp][ip][kp]);
fwrite(&a, sizeof(float), 1, fpout);
}
fprintf(FP," ... finished. \n");
for (kp=0;kp<=NPROCZ-1; kp++)
for (ip=0;ip<=NPROCX-1; ip++)
for (jp=0;jp<=NPROCY-1; jp++){
fclose(fp[jp][ip][kp]);
}
fclose(fpout);
if (SNAP_FORMAT==3){
fprintf(FP," Use \n");
fprintf(FP," xmovie n1=%d n2=%d < %s loop=1 label1=Y label2=X title=%%g \n",
((NYG-1)/IDY)+1,((NXG-1)/IDY)+1,outfile);
fprintf(FP," to play movie. \n");
fprintf(FP," ==============================================================\n");
}
}
......@@ -55,7 +55,7 @@ int main(int argc, char **argv){
int * recswitch=NULL;
MPI_Request *req_send, *req_rec, *sreq_send, *sreq_rec;
char *buff_addr, ext[10];
int * stype=NULL, * stype_loc=NULL;
......@@ -169,7 +169,7 @@ int main(int argc, char **argv){
/* ----------------------------------- */
/* Allocate memory for Bufferexchange */
/* ------------------------------------ */
buffsize=(1)*4.0*6.0*(max((NX*NZ),max((NY*NZ),(NX*NY))))*sizeof(MPI_FLOAT);
/* allocate buffer for buffering messages */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment