cleaned and restructured output on screen, changed L_inf norm to L_2 for calculation of error in Fourier space.
removed unnecessary function from math.f90 added some documents/manuals regarding spectral method
This commit is contained in:
parent
f527bdcc78
commit
0469d37fc3
|
@ -92,7 +92,7 @@ program DAMASK_spectral
|
|||
real(pReal), dimension(3,3) :: ones, zeroes, temp33_Real, &
|
||||
pstress, pstress_av, defgrad_av,&
|
||||
defgradAim, defgradAimOld, defgradAimCorr,&
|
||||
mask_stress, mask_defgrad, deltaF
|
||||
mask_stress, mask_defgrad, fDot
|
||||
real(pReal), dimension(3,3,3,3) :: dPdF, c0_reference, c_current, s_prev, c_prev ! stiffness and compliance
|
||||
real(pReal), dimension(6) :: cstress ! cauchy stress
|
||||
real(pReal), dimension(6,6) :: dsde ! small strain stiffness
|
||||
|
@ -354,6 +354,7 @@ program DAMASK_spectral
|
|||
enddo; enddo; enddo
|
||||
c0_reference = c_current * wgt ! linear reference material stiffness
|
||||
c_prev = c0_reference
|
||||
|
||||
do k = 1, resolution(3) ! calculation of discrete angular frequencies, ordered as in FFTW (wrap around)
|
||||
k_s(3) = k-1
|
||||
if(k > resolution(3)/2+1) k_s(3) = k_s(3)-resolution(3)
|
||||
|
@ -452,7 +453,7 @@ program DAMASK_spectral
|
|||
allocate (s_reduced(size_reduced,size_reduced)); s_reduced = 0.0_pReal
|
||||
|
||||
timeinc = bc_timeIncrement(loadcase)/bc_steps(loadcase) ! only valid for given linear time scale. will be overwritten later in case loglinear scale is used
|
||||
deltaF = bc_deformation(:,:,loadcase) ! only valid for given fDot. will be overwritten later in case L is given
|
||||
fDot = bc_deformation(:,:,loadcase) ! only valid for given fDot. will be overwritten later in case L is given
|
||||
!*************************************************************
|
||||
! loop oper steps defined in input file for current loadcase
|
||||
do step = 1, bc_steps(loadcase)
|
||||
|
@ -471,24 +472,24 @@ program DAMASK_spectral
|
|||
endif
|
||||
time = time + timeinc
|
||||
|
||||
if (velGradApplied(loadcase)) & ! calculate deltaF from given L and current F
|
||||
deltaF = math_mul33x33(bc_deformation(:,:,loadcase), defgradAim)
|
||||
if (velGradApplied(loadcase)) & ! calculate fDot from given L and current F
|
||||
fDot = math_mul33x33(bc_deformation(:,:,loadcase), defgradAim)
|
||||
|
||||
!winding forward of deformation aim
|
||||
temp33_Real = defgradAim
|
||||
defgradAim = defgradAim &
|
||||
+ guessmode * mask_stress * (defgradAim - defgradAimOld) &
|
||||
+ mask_defgrad * deltaF * timeinc
|
||||
+ mask_defgrad * fDot * timeinc
|
||||
defgradAimOld = temp33_Real
|
||||
|
||||
! update local deformation gradient
|
||||
do k = 1, resolution(3); do j = 1, resolution(2); do i = 1, resolution(1)
|
||||
temp33_Real = defgrad(i,j,k,:,:)
|
||||
if (velGradApplied(loadcase)) & ! use velocity gradient to calculate new deformation gradient (if not guessing)
|
||||
deltaF = math_mul33x33(bc_deformation(:,:,loadcase),defgradold(i,j,k,:,:))
|
||||
fDot = math_mul33x33(bc_deformation(:,:,loadcase),defgradold(i,j,k,:,:))
|
||||
defgrad(i,j,k,:,:) = defgrad(i,j,k,:,:) & ! decide if guessing along former trajectory or apply homogeneous addon
|
||||
+ guessmode * (defgrad(i,j,k,:,:) - defgradold(i,j,k,:,:))& ! guessing...
|
||||
+ (1.0_pReal-guessmode) * mask_defgrad * deltaF *timeinc ! apply the prescribed value where deformation is given if not guessing
|
||||
+ (1.0_pReal-guessmode) * mask_defgrad * fDot *timeinc ! apply the prescribed value where deformation is given if not guessing
|
||||
defgradold(i,j,k,:,:) = temp33_Real
|
||||
enddo; enddo; enddo
|
||||
guessmode = 1.0_pReal ! keep guessing along former trajectory during same loadcase
|
||||
|
@ -530,12 +531,17 @@ program DAMASK_spectral
|
|||
(err_div > err_div_tol .or. &
|
||||
err_stress > err_stress_tol))
|
||||
iter = iter + 1_pInt
|
||||
if (iter == itmax) not_converged_counter = not_converged_counter + 1
|
||||
print '(A,/)', '============================================================'
|
||||
print '(3(A,I5.5,tr2)/)', 'Loadcase = ',loadcase, ' Step = ',step, ' Iteration = ',iter
|
||||
print '(A)', '************************************************************'
|
||||
print '(3(A,I5.5,tr2)A)', '**** Loadcase = ',loadcase, 'Step = ',step, 'Iteration = ',iter,'****'
|
||||
print '(A)', '************************************************************'
|
||||
workfft = 0.0_pReal ! needed because of the padding for FFTW
|
||||
!*************************************************************
|
||||
print '(A,/)', '== Update Stress Field (Constitutive Evaluation P(F)) =='
|
||||
do n = 1,3; do m = 1,3
|
||||
defgrad_av(m,n) = sum(defgrad(:,:,:,m,n)) * wgt
|
||||
enddo; enddo
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Gradient:',math_transpose3x3(defgrad_av)
|
||||
|
||||
print '(A,/)', '== Update Stress Field (Constitutive Evaluation P(F)) ======'
|
||||
ielem = 0_pInt
|
||||
do k = 1, resolution(3); do j = 1, resolution(2); do i = 1, resolution(1)
|
||||
ielem = ielem + 1
|
||||
|
@ -561,38 +567,33 @@ program DAMASK_spectral
|
|||
|
||||
do n = 1,3; do m = 1,3
|
||||
pstress_av(m,n) = sum(workfft(1:resolution(1),:,:,m,n)) * wgt
|
||||
defgrad_av(m,n) = sum(defgrad(: ,:,:,m,n)) * wgt
|
||||
enddo; enddo
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Gradient:',math_transpose3x3(defgrad_av)
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Piola-Kirchhoff Stress / MPa: ',math_transpose3x3(pstress_av)/1.e6
|
||||
|
||||
err_stress_tol = 0.0_pReal
|
||||
if(size_reduced > 0_pInt) then ! calculate stress BC if applied
|
||||
err_stress = maxval(abs(mask_stress * (pstress_av - bc_stress(1:3,1:3,loadcase)))) ! maximum deviaton (tensor norm not applicable)
|
||||
do m = 1,3
|
||||
err_stress_tol = max(err_stress_tol, sum(abs(pstress_av(m,1:3)))) ! L_inf norm of average stress
|
||||
enddo
|
||||
err_stress_tol = err_stress_tol * err_stress_tolrel ! weighting by relative criterion
|
||||
print '(A,/)', '== Correcting Deformation Gradient to Fullfill BCs =='
|
||||
print '(2(a,E10.5)/)', 'Error Stress = ',err_stress, ' Tol. = ', err_stress_tol
|
||||
defgradAimCorr = - math_mul3333xx33(s_prev, ((pstress_av - bc_stress(1:3,1:3,loadcase)))) ! residual on given stress components
|
||||
if(size_reduced > 0_pInt) then ! calculate stress BC if applied
|
||||
err_stress = maxval(abs(mask_stress * (pstress_av - bc_stress(1:3,1:3,loadcase)))) ! maximum deviaton (tensor norm not applicable)
|
||||
err_stress_tol = maxval(abs(mask_defgrad * pstress_av)) * err_stress_tolrel ! don't use any tensor norm because the comparison should be coherent
|
||||
err_stress_tol = err_stress_tol * err_stress_tolrel ! weighting by relative criterion
|
||||
print '(A,/)', '== Correcting Deformation Gradient to Fullfill BCs ========='
|
||||
print '(2(a,E10.5)/)', 'Error Stress = ',err_stress, ', Tol. = ', err_stress_tol
|
||||
defgradAimCorr = - math_mul3333xx33(s_prev, ((pstress_av - bc_stress(1:3,1:3,loadcase)))) ! residual on given stress components
|
||||
defgradAim = defgradAim + defgradAimCorr
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Aim: ',math_transpose3x3(defgradAim)
|
||||
print '(a,x,f12.7,/)' , 'Determinant of Deformation Aim: ', math_det3x3(defgradAim)
|
||||
endif
|
||||
print '(A,/)', '== Calculating Equilibrium Using Spectral Method =='
|
||||
err_div = 0.0_pReal
|
||||
p_hat_avg = 0.0_pReal
|
||||
|
||||
print '(A,/)', '== Calculating Equilibrium Using Spectral Method ==========='
|
||||
call dfftw_execute_dft_r2c(plan_fft(1),workfft,workfft) ! FFT of pstress
|
||||
do m =1,3 ! L_inf norm of average stress in fourier space
|
||||
p_hat_avg = max(p_hat_avg,sum(abs(workfft(1,1,1,m,1:3)))) ! ignore imaginary part as it is always zero for real only input))
|
||||
enddo
|
||||
|
||||
|
||||
p_hat_avg = sqrt(maxval (math_eigenvalues3x3(math_mul33x33(workfft(1,1,1,1:3,1:3),& ! L_2 norm of average stress in fourier space,
|
||||
math_transpose3x3(workfft(1,1,1,1:3,1:3)))))) ! ignore imaginary part as it is always zero for real only input))
|
||||
err_div = 0.0_pReal
|
||||
do k = 1, resolution(3); do j = 1, resolution(2); do i = 1, resolution(1)/2+1
|
||||
err_div = err_div + maxval(abs(math_mul33x3_complex(workfft(i*2-1,j,k,1:3,1:3)+& ! avg of L_inf norm of div(stress) in fourier space (Suquet small strain)
|
||||
workfft(i*2, j,k,1:3,1:3)*img,xi(1:3,i,j,k))))
|
||||
err_div = err_div + sqrt(sum((math_mul33x3_complex(workfft(i*2-1,j,k,1:3,1:3)+& ! avg of L_2 norm of div(stress) in fourier space (Suquet small strain)
|
||||
workfft(i*2, j,k,1:3,1:3)*img,xi(1:3,i,j,k)))**2.0))
|
||||
enddo; enddo; enddo
|
||||
|
||||
err_div = err_div*wgt/p_hat_avg*(minval(geomdimension)*wgt**(-1/4)) ! weigthting, multiplying by minimum dimension to get rid of dimension dependency
|
||||
err_div = err_div*wgt/p_hat_avg*(minval(geomdimension)*wgt**(-1/4)) ! weigthting, multiplying by minimum dimension to get rid of dimension dependency and phenomenologigal factor wgt**(-1/4) to get rid of resolution dependency
|
||||
|
||||
if(memory_efficient) then ! memory saving version, on-the-fly calculation of gamma_hat
|
||||
do k = 1, resolution(3); do j = 1, resolution(2) ;do i = 1, resolution(1)/2+1
|
||||
|
@ -638,28 +639,26 @@ program DAMASK_spectral
|
|||
defgrad(:,:,:,m,n) = defgrad(:,:,:,m,n) + (defgradAim(m,n) - defgrad_av(m,n)) ! anticipated target minus current state
|
||||
enddo; enddo
|
||||
|
||||
do m = 1,3; do n = 1,3
|
||||
defgrad_av(m,n) = sum(defgrad(:,:,:,m,n))*wgt
|
||||
enddo; enddo
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Gradient:',math_transpose3x3(defgrad_av)
|
||||
print '(2(a,E10.5)/)', 'Error Divergence = ',err_div, ' Tol. = ', err_div_tol
|
||||
print '(2(a,E10.5)/)', 'Error Divergence = ',err_div, ', Tol. = ', err_div_tol
|
||||
|
||||
enddo ! end looping when convergency is achieved
|
||||
|
||||
c_prev = c_current*wgt ! calculate stiffness for next step
|
||||
|
||||
if (mod(step,bc_frequency(loadcase)) == 0_pInt) & ! at output frequency
|
||||
write(538) materialpoint_results(:,1,:) ! write result to file
|
||||
print '(2(A,I5.5),A,/)', 'Step = ',step, ' of Loadcase = ',loadcase, ' Converged'
|
||||
print '(a,x,f12.7,/)' , 'Determinant of Deformation Aim: ', math_det3x3(defgradAim)
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Aim: ',math_transpose3x3(defgradAim)
|
||||
print '(a,/,3(3(f12.7,x)/))', 'Deformation Gradient:',math_transpose3x3(defgrad_av)
|
||||
print '(a,/,3(3(f10.4,x)/))', 'Piola-Kirchhoff Stress / MPa (prev. Iteration): ',math_transpose3x3(pstress_av)/1.e6
|
||||
print '(A,/)', '************************************************************'
|
||||
if(err_div<err_div_tol .and. err_stress<err_stress_tol) then
|
||||
print '(2(A,I5.5),A,/)', '== Step = ',step, ' of Loadcase = ',loadcase, ' Converged =============='
|
||||
else
|
||||
print '(2(A,I5.5),A,/)', '== Step = ',step, ' of Loadcase = ',loadcase, ' NOT Converged =========='
|
||||
not_converged_counter = not_converged_counter + 1
|
||||
endif
|
||||
enddo ! end looping over steps in current loadcase
|
||||
deallocate(c_reduced)
|
||||
deallocate(s_reduced)
|
||||
enddo ! end looping over loadcases
|
||||
print '(a,i10,a)', 'A Total of ', not_converged_counter, ' Steps did not Converge!'
|
||||
print '(A,/)', '############################################################'
|
||||
print '(a,i5.5,a)', 'A Total of ', not_converged_counter, ' Steps did not Converge!'
|
||||
close(538)
|
||||
call dfftw_destroy_plan(plan_fft(1)); call dfftw_destroy_plan(plan_fft(2))
|
||||
|
||||
|
|
|
@ -1166,21 +1166,6 @@ pure function math_transpose3x3(A)
|
|||
|
||||
endfunction math_Plain33to9
|
||||
|
||||
!********************************************************************
|
||||
! convert 3x3 matrix into vector 9x1
|
||||
!********************************************************************
|
||||
pure function math_Plain33to9_logical(m33)
|
||||
|
||||
use prec, only: pReal,pInt
|
||||
implicit none
|
||||
|
||||
logical, dimension(3,3), intent(in) :: m33
|
||||
logical, dimension(9) :: math_Plain33to9_logical
|
||||
integer(pInt) i
|
||||
|
||||
forall (i=1:9) math_Plain33to9_logical(i) = m33(mapPlain(1,i),mapPlain(2,i))
|
||||
|
||||
endfunction math_Plain33to9_logical
|
||||
|
||||
!********************************************************************
|
||||
! convert Plain 9x1 back to 3x3 matrix
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,226 @@
|
|||
\documentclass[12pt,numbers,sort&compress]{article}
|
||||
|
||||
%% Use the option review to obtain double line spacing
|
||||
%% \documentclass[authoryear,preprint,review,12pt]{elsarticle}
|
||||
|
||||
%% Use the options 1p,twocolumn; 3p; 3p,twocolumn; 5p; or 5p,twocolumn
|
||||
%% for a journal layout:
|
||||
%% \documentclass[final,1p,times]{elsarticle}
|
||||
%% \documentclass[final,1p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,3p,times]{elsarticle}
|
||||
%% \documentclass[final,3p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,5p,times]{elsarticle}
|
||||
%% \documentclass[final,5p,times,twocolumn]{elsarticle}
|
||||
|
||||
%% if you use PostScript figures in your article
|
||||
%% use the graphics package for simple commands
|
||||
%% \usepackage{graphics}
|
||||
%% or use the graphicx package for more complicated commands
|
||||
%% \usepackage{graphicx}
|
||||
%% or use the epsfig package if you prefer to use the old commands
|
||||
%% \usepackage{epsfig}
|
||||
|
||||
%% The amssymb package provides various useful mathematical symbols
|
||||
\usepackage[usenames,dvipsnames,pdftex]{color}
|
||||
\usepackage{amsmath,amssymb,amsfonts}
|
||||
\usepackage{siunitx}
|
||||
%\usepackage{subeqnarray}
|
||||
\usepackage[hang]{subfigure}
|
||||
\usepackage{verbatim}
|
||||
\usepackage{bm}
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{arrows}
|
||||
\usepackage{booktabs}
|
||||
|
||||
\usepackage{graphicx}
|
||||
\newcommand{\pathToFigures}{./figures}
|
||||
\graphicspath{{\pathToFigures/}}
|
||||
\DeclareGraphicsExtensions{.pdf,.png}
|
||||
|
||||
\usepackage[pdftex, % hyper-references for pdftex
|
||||
bookmarksnumbered=true,% % generate bookmarks with numbers
|
||||
pagebackref=true,% % generate backref in biblio
|
||||
colorlinks=true,%
|
||||
]{hyperref}%
|
||||
|
||||
%% The amsthm package provides extended theorem environments
|
||||
%% \usepackage{amsthm}
|
||||
|
||||
%% The lineno packages adds line numbers. Start line numbering with
|
||||
%% \begin{linenumbers}, end it with \end{linenumbers}. Or switch it on
|
||||
%% for the whole article with \linenumbers.
|
||||
%% \usepackage{lineno}
|
||||
|
||||
\newlength{\diagramsize}
|
||||
\setlength{\diagramsize}{0.4\textwidth}
|
||||
|
||||
\newcommand{\question}[1]{\textcolor{Red}{#1}}
|
||||
\newcommand{\note}[1]{\textcolor{CornflowerBlue}{#1}}
|
||||
\newcommand{\term}[1]{\textsc{#1}}
|
||||
|
||||
\newcommand{\eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\Eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\Erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\Fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\Frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\Tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\trefs}[1]{Tabs.~\ref{#1}}
|
||||
\newcommand{\Trefs}[1]{Tabs.~\ref{#1}}
|
||||
|
||||
\newcommand{\ie}{\textit{i.e.}}
|
||||
\newcommand{\eg}{\textit{e.g.}}
|
||||
\newcommand{\cf}{\textit{cf.}}
|
||||
\newcommand{\Euler}{\textsc{Euler}}
|
||||
\newcommand{\Gauss}{\textsc{Gauss}}
|
||||
|
||||
\newcommand{\kB}{\ensuremath{k_\text{B}}}
|
||||
|
||||
\newcommand{\transpose}[1]{\ensuremath{{#1}^{\mathrm T}}}
|
||||
\newcommand{\inverse}[1]{\ensuremath{{#1}^{-1}}}
|
||||
\newcommand{\invtranspose}[1]{\ensuremath{{#1}^{\mathrm{-T}}}}
|
||||
\newcommand{\sign}[1]{\ensuremath{\operatorname{sgn}\left({#1}\right)}}
|
||||
\newcommand{\grad}[1][]{\ensuremath{\operatorname{grad}{#1}}}
|
||||
\newcommand{\Grad}[1][]{\ensuremath{\operatorname{Grad}{#1}}}
|
||||
\newcommand{\divergence}[1][]{\ensuremath{\operatorname{div}{#1}}}
|
||||
\newcommand{\Divergence}[1][]{\ensuremath{\operatorname{Div}{#1}}}
|
||||
\newcommand{\totalder}[2]{\ensuremath{\frac{\inc{#1}}{\inc{#2}}}}
|
||||
\newcommand{\partialder}[2]{\ensuremath{\frac{\partial{#1}}{\partial{#2}}}}
|
||||
\newcommand{\inc}[1]{\ensuremath{\text d{#1}}}
|
||||
\newcommand{\abs}[1]{\ensuremath{\left|{#1}\right|}}
|
||||
\newcommand{\norm}[1]{\ensuremath{\left|\left|{#1}\right|\right|}}
|
||||
|
||||
\newcommand{\avg}[1]{\ensuremath{\bar{#1}}}
|
||||
\newcommand{\fluct}[1]{\ensuremath{\tilde{#1}}}
|
||||
\newcommand{\FT}[1]{\ensuremath{\hat{#1}}}
|
||||
|
||||
\newcommand{\domain}[1]{\ensuremath{\mathcal{#1}}}
|
||||
\newcommand{\tnsrfour}[1]{\ensuremath{\mathbb{#1}}}
|
||||
\newcommand{\tnsr}[1]{\ensuremath{\bm{#1}}}
|
||||
\newcommand{\vctr}[1]{\ensuremath{\bm{#1}}}
|
||||
|
||||
\newcommand{\eyetwo}{\ensuremath{\tnsr I}}
|
||||
\newcommand{\eyefour}{\ensuremath{\tnsrfour I}}
|
||||
|
||||
\newcommand{\stiffness}{\ensuremath{\tnsrfour D}}
|
||||
\newcommand{\refStiffness}{\ensuremath{\avg{\tnsrfour D}}}
|
||||
\newcommand{\fPK}{\ensuremath{\tnsr P}}
|
||||
\newcommand{\sPK}{\ensuremath{\tnsr S}}
|
||||
\newcommand{\F}[1][]{\ensuremath{\tnsr F^{#1}}}
|
||||
\newcommand{\Favg}{\ensuremath{\avg{\F}}}
|
||||
\newcommand{\Ffluct}{\ensuremath{\fluct{\F}}}
|
||||
\newcommand{\Fp}[1][]{\ensuremath{\tnsr F_\text{p}^{#1}}}
|
||||
\newcommand{\Fe}[1][]{\ensuremath{\tnsr F_\text{e}^{#1}}}
|
||||
\newcommand{\Lp}{\ensuremath{\tnsr L_\text{p}}}
|
||||
\newcommand{\Q}[1]{\ensuremath{\tnsr Q^{(#1)}}}
|
||||
\newcommand{\x}[2][]{\ensuremath{\vctr x^{(#2)}_\text{#1}}}
|
||||
\newcommand{\dg}[2][]{\ensuremath{\Delta\vctr g^{(#2)}_\text{#1}}}
|
||||
\newcommand{\g}[1][]{\ensuremath{\vctr g_\text{#1}}}
|
||||
\newcommand{\A}[2][]{\ensuremath{A^{(#2)}_\text{#1}}}
|
||||
\newcommand{\N}[2]{\ensuremath{\varrho^{(#1)}_\text{#2}}}
|
||||
\newcommand{\Burgers}[1]{\ensuremath{\vctr s^{(#1)}}}
|
||||
\newcommand{\n}[1]{\ensuremath{\vctr n^{(#1)}}}
|
||||
\newcommand{\m}[2]{\ensuremath{\vctr m^{(#1)}_{#2}}}
|
||||
\newcommand{\ld}[1]{\ensuremath{\vctr p^{(#1)}}}
|
||||
\newcommand{\velocity}[2]{\ensuremath{v^{(#1)}_\text{#2}}}
|
||||
\newcommand{\avgvelocity}[2]{\ensuremath{{\bar v}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\flux}[2]{\ensuremath{\vctr f^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\averageflux}[2]{\ensuremath{\bar{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\interfaceflux}[2]{\ensuremath{\tilde{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\transmissivity}[1]{\ensuremath{\chi^{(#1)}}}
|
||||
\newcommand{\galpha}{\ensuremath{\gamma^{(\alpha)}}}
|
||||
\newcommand{\dotgalpha}{\ensuremath{\dot{\gamma}^{(\alpha)}}}
|
||||
\newcommand{\taualpha}{\ensuremath{\tau^{(\alpha)}}}
|
||||
\newcommand{\taualphamax}{\ensuremath{\hat\tau^{(\alpha)}}}
|
||||
\newcommand{\density}[2]{\ensuremath{\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityfunc}[2]{\ensuremath{{\tilde\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\avgdensity}[2]{\ensuremath{{\bar\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\dotdensity}[2]{\ensuremath{\dot{\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityexcess}[2]{\ensuremath{\Delta\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\cs}[2][]{\ensuremath{\sigma^{(#1)}_ \text{#2}}}
|
||||
|
||||
|
||||
|
||||
|
||||
%% Title, authors and addresses
|
||||
|
||||
%% use the tnoteref command within \title for footnotes;
|
||||
%% use the tnotetext command for theassociated footnote;
|
||||
%% use the fnref command within \author or \address for footnotes;
|
||||
%% use the fntext command for theassociated footnote;
|
||||
%% use the corref command within \author for corresponding author footnotes;
|
||||
%% use the cortext command for theassociated footnote;
|
||||
%% use the ead command for the email address,
|
||||
%% and the form \ead[url] for the home page:
|
||||
%% \title{Title\tnoteref{label1}}
|
||||
%% \tnotetext[label1]{}
|
||||
%% \author{Name\corref{cor1}\fnref{label2}}
|
||||
%% \ead{email address}
|
||||
%% \ead[url]{home page}
|
||||
%% \fntext[label2]{}
|
||||
%% \cortext[cor1]{}
|
||||
%% \address{Address\fnref{label3}}
|
||||
%% \fntext[label3]{}
|
||||
|
||||
\title{Calculation of Divergence in Fourier space}
|
||||
|
||||
%% use optional labels to link authors explicitly to addresses:
|
||||
%% \author[label1,label2]{}
|
||||
%% \address[label1]{}
|
||||
%% \address[label2]{}
|
||||
|
||||
\author{M.~Diehl}
|
||||
|
||||
%% \linenumbers
|
||||
|
||||
% main text
|
||||
\begin{document}
|
||||
\maketitle
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
\section{Idea}
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
A field of 3x3 tensors in the form
|
||||
\begin{equation}
|
||||
\begin{pmatrix} P_{11} & P_{12} & P_{13}\\ P_{21} & P_{22} & P_{23} \\ P_{31} & P_{32}& P_{33} \end{pmatrix} = \tnsr{P}(\vec{x})
|
||||
\end{equation}
|
||||
depending on a discrete 3D vector $\vec x$ (spatial coordinates in real space)
|
||||
\begin{equation}
|
||||
\vec x \mathrm{~with~} x_1=1,2,...,N_1\mathrm{,~}x_2=1,2,...,N_2\mathrm{,~and~}x_3=1,2,...,N_3
|
||||
\end{equation}
|
||||
is transformed into Fourier space using the FFT (Subroutines provided by FFTW, 9 transforms of rank 3). The result is a 3x3 tensor field depending on the frequencies $\vec \xi$:
|
||||
\begin{equation}
|
||||
\hat{\tnsr P}(\vec \xi) = \mathcal{F}\left( \tnsr P(\vec x) \right)
|
||||
\end{equation}
|
||||
the divergence of a tensor is defined as:
|
||||
\begin{equation}
|
||||
\operatorname{div}\,(\tnsr P) =
|
||||
\begin{pmatrix}
|
||||
\frac{\partial P_{11}}{\partial x_1} +\frac{\partial P_{12}}{\partial x_2} +\frac{\partial P_{13}}{\partial x_3}\\[6pt]
|
||||
\frac{\partial P_{21}}{\partial x_1} +\frac{\partial P_{22}}{\partial x_2} +\frac{\partial P_{23}}{\partial x_3}\\[6pt]
|
||||
\frac{\partial P_{z1}}{\partial x_1} +\frac{\partial P_{z2}}{\partial x_2} +\frac{\partial P_{33}}{\partial x_3}
|
||||
\end{pmatrix}
|
||||
\end{equation}
|
||||
It is a 3D vector. With
|
||||
\begin{equation}\label{div}
|
||||
\mathcal{F}(\frac{d^n f(x)}{dx^n}) = (2\pi i\xi)^n \hat{f}(\xi)
|
||||
\end{equation}
|
||||
follows:
|
||||
\begin{equation}
|
||||
\mathcal{F}\left(\operatorname{div}\,(\tnsr P) \right) = 2\pi i\vec \xi \times \hat{\tnsr P}(\vec \xi)
|
||||
\end{equation}
|
||||
Due to the order in which FFTW stores the array, the components of the 3D frequencies can be calculated by dividing a linear list $0,1,2,...N/2-1,\pm N/2,-(N/2-1),...,-2,-1$ by the sampling length in each dimension.
|
||||
|
||||
|
||||
\section{Questions}
|
||||
The inverse transform of $\mathcal{F}\left(\operatorname{div}\,(\tnsr P) \right)$ (FFTW, 3 transforms of rank 3) should give the divergence field in real space.
|
||||
|
||||
My problem is, that the calculated divergence has imaginary parts after the inverse transform. That seems strange to me, as the divergence can also be computed in real space, e.g. using FDM.
|
||||
If a complex-to-complex transform is done, $\hat{\tnsr P} (\vec \xi)$ possesses conjugate complex symmetry.
|
||||
$\operatorname{div}\,(\hat{\tnsr P})(\vec xi) \right)$ should also have conjugate complex symmetry as it would lead to a real-only divergence after the inverse transform. Surprisingly, even for the simple derivative as given in formula eq.(\ref{div}), the complex conjugate symmetry is also not preserved. The multiplication changes the sign of the whole term and not only of the imaginary part.
|
||||
|
||||
As the tensor $\tnsr P$ is a real-only tensor, it should be possible to use a real-to-complex transform for the tensor field and a complex-to-real transform for the back transform of the divergence field. Than one of the dimensions should run from $0$ to $N/2+1$ only. But that implies, that the divergence in Fourier space has conjugate compley symmetry.
|
||||
\end{document}
|
||||
\endinput
|
Binary file not shown.
|
@ -0,0 +1,231 @@
|
|||
\documentclass[12pt,numbers,sort&compress]{article}
|
||||
|
||||
%% Use the option review to obtain double line spacing
|
||||
%% \documentclass[authoryear,preprint,review,12pt]{elsarticle}
|
||||
|
||||
%% Use the options 1p,twocolumn; 3p; 3p,twocolumn; 5p; or 5p,twocolumn
|
||||
%% for a journal layout:
|
||||
%% \documentclass[final,1p,times]{elsarticle}
|
||||
%% \documentclass[final,1p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,3p,times]{elsarticle}
|
||||
%% \documentclass[final,3p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,5p,times]{elsarticle}
|
||||
%% \documentclass[final,5p,times,twocolumn]{elsarticle}
|
||||
|
||||
%% if you use PostScript figures in your article
|
||||
%% use the graphics package for simple commands
|
||||
%% \usepackage{graphics}
|
||||
%% or use the graphicx package for more complicated commands
|
||||
%% \usepackage{graphicx}
|
||||
%% or use the epsfig package if you prefer to use the old commands
|
||||
%% \usepackage{epsfig}
|
||||
|
||||
%% The amssymb package provides various useful mathematical symbols
|
||||
\usepackage[usenames,dvipsnames,pdftex]{color}
|
||||
\usepackage{amsmath,amssymb,amsfonts}
|
||||
\usepackage{siunitx}
|
||||
%\usepackage{subeqnarray}
|
||||
\usepackage[hang]{subfigure}
|
||||
\usepackage{verbatim}
|
||||
\usepackage{bm}
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{arrows}
|
||||
\usepackage{booktabs}
|
||||
|
||||
\usepackage{graphicx}
|
||||
\newcommand{\pathToFigures}{./figures}
|
||||
\graphicspath{{\pathToFigures/}}
|
||||
\DeclareGraphicsExtensions{.pdf,.png}
|
||||
|
||||
\usepackage[pdftex, % hyper-references for pdftex
|
||||
bookmarksnumbered=true,% % generate bookmarks with numbers
|
||||
pagebackref=true,% % generate backref in biblio
|
||||
colorlinks=true,%
|
||||
]{hyperref}%
|
||||
|
||||
%% The amsthm package provides extended theorem environments
|
||||
%% \usepackage{amsthm}
|
||||
|
||||
%% The lineno packages adds line numbers. Start line numbering with
|
||||
%% \begin{linenumbers}, end it with \end{linenumbers}. Or switch it on
|
||||
%% for the whole article with \linenumbers.
|
||||
%% \usepackage{lineno}
|
||||
|
||||
\newlength{\diagramsize}
|
||||
\setlength{\diagramsize}{0.4\textwidth}
|
||||
|
||||
\newcommand{\question}[1]{\textcolor{Red}{#1}}
|
||||
\newcommand{\note}[1]{\textcolor{CornflowerBlue}{#1}}
|
||||
\newcommand{\term}[1]{\textsc{#1}}
|
||||
|
||||
\newcommand{\eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\Eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\Erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\Fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\Frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\Tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\trefs}[1]{Tabs.~\ref{#1}}
|
||||
\newcommand{\Trefs}[1]{Tabs.~\ref{#1}}
|
||||
|
||||
\newcommand{\ie}{\textit{i.e.}}
|
||||
\newcommand{\eg}{\textit{e.g.}}
|
||||
\newcommand{\cf}{\textit{cf.}}
|
||||
\newcommand{\Euler}{\textsc{Euler}}
|
||||
\newcommand{\Gauss}{\textsc{Gauss}}
|
||||
|
||||
\newcommand{\kB}{\ensuremath{k_\text{B}}}
|
||||
|
||||
\newcommand{\transpose}[1]{\ensuremath{{#1}^{\mathrm T}}}
|
||||
\newcommand{\inverse}[1]{\ensuremath{{#1}^{-1}}}
|
||||
\newcommand{\invtranspose}[1]{\ensuremath{{#1}^{\mathrm{-T}}}}
|
||||
\newcommand{\sign}[1]{\ensuremath{\operatorname{sgn}\left({#1}\right)}}
|
||||
\newcommand{\grad}[1][]{\ensuremath{\operatorname{grad}{#1}}}
|
||||
\newcommand{\Grad}[1][]{\ensuremath{\operatorname{Grad}{#1}}}
|
||||
\newcommand{\divergence}[1][]{\ensuremath{\operatorname{div}{#1}}}
|
||||
\newcommand{\Divergence}[1][]{\ensuremath{\operatorname{Div}{#1}}}
|
||||
\newcommand{\totalder}[2]{\ensuremath{\frac{\inc{#1}}{\inc{#2}}}}
|
||||
\newcommand{\partialder}[2]{\ensuremath{\frac{\partial{#1}}{\partial{#2}}}}
|
||||
\newcommand{\inc}[1]{\ensuremath{\text d{#1}}}
|
||||
\newcommand{\abs}[1]{\ensuremath{\left|{#1}\right|}}
|
||||
\newcommand{\norm}[1]{\ensuremath{\left|\left|{#1}\right|\right|}}
|
||||
|
||||
\newcommand{\avg}[1]{\ensuremath{\bar{#1}}}
|
||||
\newcommand{\fluct}[1]{\ensuremath{\tilde{#1}}}
|
||||
\newcommand{\FT}[1]{\ensuremath{\hat{#1}}}
|
||||
|
||||
\newcommand{\domain}[1]{\ensuremath{\mathcal{#1}}}
|
||||
\newcommand{\tnsrfour}[1]{\ensuremath{\mathbb{#1}}}
|
||||
\newcommand{\tnsr}[1]{\ensuremath{\bm{#1}}}
|
||||
\newcommand{\vctr}[1]{\ensuremath{\bm{#1}}}
|
||||
|
||||
\newcommand{\eyetwo}{\ensuremath{\tnsr I}}
|
||||
\newcommand{\eyefour}{\ensuremath{\tnsrfour I}}
|
||||
|
||||
\newcommand{\stiffness}{\ensuremath{\tnsrfour D}}
|
||||
\newcommand{\refStiffness}{\ensuremath{\avg{\tnsrfour D}}}
|
||||
\newcommand{\fPK}{\ensuremath{\tnsr P}}
|
||||
\newcommand{\sPK}{\ensuremath{\tnsr S}}
|
||||
\newcommand{\F}[1][]{\ensuremath{\tnsr F^{#1}}}
|
||||
\newcommand{\Favg}{\ensuremath{\avg{\F}}}
|
||||
\newcommand{\Ffluct}{\ensuremath{\fluct{\F}}}
|
||||
\newcommand{\Fp}[1][]{\ensuremath{\tnsr F_\text{p}^{#1}}}
|
||||
\newcommand{\Fe}[1][]{\ensuremath{\tnsr F_\text{e}^{#1}}}
|
||||
\newcommand{\Lp}{\ensuremath{\tnsr L_\text{p}}}
|
||||
\newcommand{\Q}[1]{\ensuremath{\tnsr Q^{(#1)}}}
|
||||
\newcommand{\x}[2][]{\ensuremath{\vctr x^{(#2)}_\text{#1}}}
|
||||
\newcommand{\dg}[2][]{\ensuremath{\Delta\vctr g^{(#2)}_\text{#1}}}
|
||||
\newcommand{\g}[1][]{\ensuremath{\vctr g_\text{#1}}}
|
||||
\newcommand{\A}[2][]{\ensuremath{A^{(#2)}_\text{#1}}}
|
||||
\newcommand{\N}[2]{\ensuremath{\varrho^{(#1)}_\text{#2}}}
|
||||
\newcommand{\Burgers}[1]{\ensuremath{\vctr s^{(#1)}}}
|
||||
\newcommand{\n}[1]{\ensuremath{\vctr n^{(#1)}}}
|
||||
\newcommand{\m}[2]{\ensuremath{\vctr m^{(#1)}_{#2}}}
|
||||
\newcommand{\ld}[1]{\ensuremath{\vctr p^{(#1)}}}
|
||||
\newcommand{\velocity}[2]{\ensuremath{v^{(#1)}_\text{#2}}}
|
||||
\newcommand{\avgvelocity}[2]{\ensuremath{{\bar v}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\flux}[2]{\ensuremath{\vctr f^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\averageflux}[2]{\ensuremath{\bar{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\interfaceflux}[2]{\ensuremath{\tilde{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\transmissivity}[1]{\ensuremath{\chi^{(#1)}}}
|
||||
\newcommand{\galpha}{\ensuremath{\gamma^{(\alpha)}}}
|
||||
\newcommand{\dotgalpha}{\ensuremath{\dot{\gamma}^{(\alpha)}}}
|
||||
\newcommand{\taualpha}{\ensuremath{\tau^{(\alpha)}}}
|
||||
\newcommand{\taualphamax}{\ensuremath{\hat\tau^{(\alpha)}}}
|
||||
\newcommand{\density}[2]{\ensuremath{\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityfunc}[2]{\ensuremath{{\tilde\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\avgdensity}[2]{\ensuremath{{\bar\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\dotdensity}[2]{\ensuremath{\dot{\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityexcess}[2]{\ensuremath{\Delta\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\cs}[2][]{\ensuremath{\sigma^{(#1)}_ \text{#2}}}
|
||||
|
||||
|
||||
|
||||
|
||||
%% Title, authors and addresses
|
||||
|
||||
%% use the tnoteref command within \title for footnotes;
|
||||
%% use the tnotetext command for theassociated footnote;
|
||||
%% use the fnref command within \author or \address for footnotes;
|
||||
%% use the fntext command for theassociated footnote;
|
||||
%% use the corref command within \author for corresponding author footnotes;
|
||||
%% use the cortext command for theassociated footnote;
|
||||
%% use the ead command for the email address,
|
||||
%% and the form \ead[url] for the home page:
|
||||
%% \title{Title\tnoteref{label1}}
|
||||
%% \tnotetext[label1]{}
|
||||
%% \author{Name\corref{cor1}\fnref{label2}}
|
||||
%% \ead{email address}
|
||||
%% \ead[url]{home page}
|
||||
%% \fntext[label2]{}
|
||||
%% \cortext[cor1]{}
|
||||
%% \address{Address\fnref{label3}}
|
||||
%% \fntext[label3]{}
|
||||
|
||||
\title{Fourier Transforms}
|
||||
|
||||
%% use optional labels to link authors explicitly to addresses:
|
||||
%% \author[label1,label2]{}
|
||||
%% \address[label1]{}
|
||||
%% \address[label2]{}
|
||||
|
||||
\author{M.~Diehl}
|
||||
|
||||
%% \linenumbers
|
||||
|
||||
% main text
|
||||
\begin{document}
|
||||
\maketitle
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
\section{Discrete vs. continuous FT}
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
continuous Fourier transform
|
||||
\begin{equation}
|
||||
\hat{f}(k) = \int \limits_{-\pi}^{\pi} f(x) \cdot e^{-2\pi i k x} \inc x
|
||||
\end{equation}
|
||||
discrete Fourier transform
|
||||
\begin{align}
|
||||
\hat{f}_k &= \frac{1}{d} \sum\limits_{n=0}^{N-1} f \left( x = \frac{n}{N}d \right) \cdot e^{\left(-2 \pi i \cdot \frac{k}{d} \cdot \frac{n}{N} \cdot d \right)} \cdot \frac{d}{N}\\
|
||||
&= \frac{1}{N} \sum \limits_{n=0}^{N-1} f \left( x = \frac{n}{N} d \right) \cdot e^{-\frac{2 \pi i}{N} \cdot k \cdot n}
|
||||
\end{align}
|
||||
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
\section{Differentation}
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
Expression in frequency and angular frequency
|
||||
\begin{align}
|
||||
\hat{f}(k) &= \frac{1}{d} \int \limits_0^d f(x) e^{\frac{-2 \pi i}{d} k x}\\
|
||||
&= \frac{1}{d} \int \limits_0^d f(x) e^{-2 \pi i \xi x} \inc x
|
||||
\end{align}
|
||||
\begin{align}
|
||||
\hat{f}'&= \frac{\partial}{\partial x} \left( \int \limits_{-\infty }^{\infty} \hat{f}(x) \cdot e^{i \xi x} \inc k \right)\\
|
||||
&= \int \limits_{-\infty}^{\infty} \frac{\partial}{\partial x} \left( \hat{f}(x) \cdot e^{i \xi x} \right) \inc k\\
|
||||
&= \int \limits_{-\infty}^{\infty} i \xi \cdot \hat{f}(x) \cdot e^{i \xi x} \inc k
|
||||
\end{align}
|
||||
|
||||
\section{Transform}
|
||||
example with $N=4$ and $x = \mathrm{sin}\left( \frac{n}{N} \cdot 2 \pi \right)$
|
||||
\begin{align}
|
||||
X_k &= \sum \limits_{n=0}^{N-1} x_n \cdot e ^{- \frac{2 \pi i }{N} \cdot k \cdot n};~~~k = 0;1;..;N-1\\
|
||||
&= \sum \limits_{n=0}^{N-1} x_n \cdot \left(\mathrm{cos}\left(- \frac{2 \pi}{N}\cdot k \cdot n \right) + i\cdot \mathrm{sin}\left(- \frac{2 \pi}{N} \cdot k \cdot n\right) \right)\\
|
||||
X_0 &= \sum \limits_{n=0}^{N-1} x_n e ^\\
|
||||
&= 0 + 1 + 0 +(-1) = 0 \\
|
||||
X_1 &= \sum \limits_{n=0}^{N-1} x_n e^{-i \frac{2\pi}{N} \cdot 1 \cdot n} = 0 + e ^ {-i \frac{2\pi}{N} \cdot 1 \cdot 1} + 0 +e ^ {-i \frac{2\pi}{N} \cdot 1 \cdot 3}\\
|
||||
&= 0 + (- 2i)\\
|
||||
X_2 &= 0 + 0i\\
|
||||
X_3 &= 0 + 2i
|
||||
\end{align}
|
||||
$X_2$ is Nyquist frequency and has only a real part, $X_3$ is conjugate complex of $X_1$ for real only input.
|
||||
\section{Inverse Transform}
|
||||
\begin{align}
|
||||
x_n &= \frac{1}{N} \sum \limits_{k=0}^{N-1} X_k e^{\frac{2\pi i}{N} \cdot k \cdot n}\\
|
||||
x_0 &= \frac{1}{4}\left(0 - 2ie^0 + 0 + 2ie^0 \right) = 0\\
|
||||
x_1 &= \frac{1}{4}\left(0 - 2ie^{\frac{2\pi i}{4}\cdot 1 \cdot 1} + 0 + 2ie^{\frac{2\pi i}{4}\cdot 3 \cdot 1} \right) = 1\\
|
||||
x_2 &= 0\\
|
||||
x_1 &= -1
|
||||
\end{align}
|
||||
\end{document}
|
||||
\endinput
|
Binary file not shown.
|
@ -0,0 +1,202 @@
|
|||
\documentclass[12pt,numbers,sort&compress]{article}
|
||||
|
||||
%% Use the option review to obtain double line spacing
|
||||
%% \documentclass[authoryear,preprint,review,12pt]{elsarticle}
|
||||
|
||||
%% Use the options 1p,twocolumn; 3p; 3p,twocolumn; 5p; or 5p,twocolumn
|
||||
%% for a journal layout:
|
||||
%% \documentclass[final,1p,times]{elsarticle}
|
||||
%% \documentclass[final,1p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,3p,times]{elsarticle}
|
||||
%% \documentclass[final,3p,times,twocolumn]{elsarticle}
|
||||
%% \documentclass[final,5p,times]{elsarticle}
|
||||
%% \documentclass[final,5p,times,twocolumn]{elsarticle}
|
||||
|
||||
%% if you use PostScript figures in your article
|
||||
%% use the graphics package for simple commands
|
||||
%% \usepackage{graphics}
|
||||
%% or use the graphicx package for more complicated commands
|
||||
%% \usepackage{graphicx}
|
||||
%% or use the epsfig package if you prefer to use the old commands
|
||||
%% \usepackage{epsfig}
|
||||
|
||||
%% The amssymb package provides various useful mathematical symbols
|
||||
\usepackage[usenames,dvipsnames,pdftex]{color}
|
||||
\usepackage{amsmath,amssymb,amsfonts}
|
||||
\usepackage{siunitx}
|
||||
%\usepackage{subeqnarray}
|
||||
\usepackage[hang]{subfigure}
|
||||
\usepackage{verbatim}
|
||||
\usepackage{bm}
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{arrows}
|
||||
\usepackage{booktabs}
|
||||
\usepackage[latin1]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{natbib}
|
||||
\newcommand{\pathToFigures}{./figures}
|
||||
\graphicspath{{\pathToFigures/}}
|
||||
\DeclareGraphicsExtensions{.pdf,.png}
|
||||
|
||||
\usepackage[pdftex, % hyper-references for pdftex
|
||||
bookmarksnumbered=true,% % generate bookmarks with numbers
|
||||
%pagebackref=true,% % generate backref in biblio
|
||||
%colorlinks=true,%
|
||||
]{hyperref}%
|
||||
|
||||
%% The amsthm package provides extended theorem environments
|
||||
%% \usepackage{amsthm}
|
||||
|
||||
%% The lineno packages adds line numbers. Start line numbering with
|
||||
%% \begin{linenumbers}, end it with \end{linenumbers}. Or switch it on
|
||||
%% for the whole article with \linenumbers.
|
||||
%% \usepackage{lineno}
|
||||
|
||||
\newlength{\diagramsize}
|
||||
\setlength{\diagramsize}{0.4\textwidth}
|
||||
|
||||
\newcommand{\question}[1]{\textcolor{Red}{#1}}
|
||||
\newcommand{\note}[1]{\textcolor{CornflowerBlue}{#1}}
|
||||
\newcommand{\term}[1]{\textsc{#1}}
|
||||
|
||||
\newcommand{\eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\Eref}[1]{Eq.~\eqref{#1}}
|
||||
\newcommand{\erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\Erefs}[1]{Eqs.~\eqref{#1}}
|
||||
\newcommand{\fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\Fref}[1]{Fig.~\ref{#1}}
|
||||
\newcommand{\frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\Frefs}[1]{Figs.~\ref{#1}}
|
||||
\newcommand{\tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\Tref}[1]{Tab.~\ref{#1}}
|
||||
\newcommand{\trefs}[1]{Tabs.~\ref{#1}}
|
||||
\newcommand{\Trefs}[1]{Tabs.~\ref{#1}}
|
||||
|
||||
\newcommand{\ie}{\textit{i.e.}}
|
||||
\newcommand{\eg}{\textit{e.g.}}
|
||||
\newcommand{\cf}{\textit{cf.}}
|
||||
\newcommand{\Euler}{\textsc{Euler}}
|
||||
\newcommand{\Gauss}{\textsc{Gauss}}
|
||||
|
||||
\newcommand{\kB}{\ensuremath{k_\text{B}}}
|
||||
|
||||
\newcommand{\transpose}[1]{\ensuremath{{#1}^{\mathrm T}}}
|
||||
\newcommand{\inverse}[1]{\ensuremath{{#1}^{-1}}}
|
||||
\newcommand{\invtranspose}[1]{\ensuremath{{#1}^{\mathrm{-T}}}}
|
||||
\newcommand{\sign}[1]{\ensuremath{\operatorname{sgn}\left({#1}\right)}}
|
||||
\newcommand{\grad}[1][]{\ensuremath{\operatorname{grad}{#1}}}
|
||||
\newcommand{\Grad}[1][]{\ensuremath{\operatorname{Grad}{#1}}}
|
||||
\newcommand{\divergence}[1][]{\ensuremath{\operatorname{div}{#1}}}
|
||||
\newcommand{\Divergence}[1][]{\ensuremath{\operatorname{Div}{#1}}}
|
||||
\newcommand{\totalder}[2]{\ensuremath{\frac{\inc{#1}}{\inc{#2}}}}
|
||||
\newcommand{\partialder}[2]{\ensuremath{\frac{\partial{#1}}{\partial{#2}}}}
|
||||
\newcommand{\inc}[1]{\ensuremath{\text d{#1}}}
|
||||
\newcommand{\abs}[1]{\ensuremath{\left|{#1}\right|}}
|
||||
\newcommand{\norm}[1]{\ensuremath{\left|\left|{#1}\right|\right|}}
|
||||
|
||||
\newcommand{\avg}[1]{\ensuremath{\bar{#1}}}
|
||||
\newcommand{\fluct}[1]{\ensuremath{\tilde{#1}}}
|
||||
\newcommand{\FT}[1]{\ensuremath{\hat{#1}}}
|
||||
|
||||
\newcommand{\domain}[1]{\ensuremath{\mathcal{#1}}}
|
||||
\newcommand{\tnsrfour}[1]{\ensuremath{\mathbb{#1}}}
|
||||
\newcommand{\tnsr}[1]{\ensuremath{\bm{#1}}}
|
||||
\newcommand{\vctr}[1]{\ensuremath{\bm{#1}}}
|
||||
|
||||
\newcommand{\eyetwo}{\ensuremath{\tnsr I}}
|
||||
\newcommand{\eyefour}{\ensuremath{\tnsrfour I}}
|
||||
|
||||
\newcommand{\stiffness}{\ensuremath{\tnsrfour D}}
|
||||
\newcommand{\refStiffness}{\ensuremath{\avg{\tnsrfour D}}}
|
||||
\newcommand{\fPK}{\ensuremath{\tnsr P}}
|
||||
\newcommand{\sPK}{\ensuremath{\tnsr S}}
|
||||
\newcommand{\F}[1][]{\ensuremath{\tnsr F^{#1}}}
|
||||
\newcommand{\Favg}{\ensuremath{\avg{\F}}}
|
||||
\newcommand{\Ffluct}{\ensuremath{\fluct{\F}}}
|
||||
\newcommand{\Fp}[1][]{\ensuremath{\tnsr F_\text{p}^{#1}}}
|
||||
\newcommand{\Fe}[1][]{\ensuremath{\tnsr F_\text{e}^{#1}}}
|
||||
\newcommand{\Lp}{\ensuremath{\tnsr L_\text{p}}}
|
||||
\newcommand{\Q}[1]{\ensuremath{\tnsr Q^{(#1)}}}
|
||||
\newcommand{\x}[2][]{\ensuremath{\vctr x^{(#2)}_\text{#1}}}
|
||||
\newcommand{\dg}[2][]{\ensuremath{\Delta\vctr g^{(#2)}_\text{#1}}}
|
||||
\newcommand{\g}[1][]{\ensuremath{\vctr g_\text{#1}}}
|
||||
\newcommand{\A}[2][]{\ensuremath{A^{(#2)}_\text{#1}}}
|
||||
\newcommand{\N}[2]{\ensuremath{\varrho^{(#1)}_\text{#2}}}
|
||||
\newcommand{\Burgers}[1]{\ensuremath{\vctr s^{(#1)}}}
|
||||
\newcommand{\n}[1]{\ensuremath{\vctr n^{(#1)}}}
|
||||
\newcommand{\m}[2]{\ensuremath{\vctr m^{(#1)}_{#2}}}
|
||||
\newcommand{\ld}[1]{\ensuremath{\vctr p^{(#1)}}}
|
||||
\newcommand{\velocity}[2]{\ensuremath{v^{(#1)}_\text{#2}}}
|
||||
\newcommand{\avgvelocity}[2]{\ensuremath{{\bar v}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\flux}[2]{\ensuremath{\vctr f^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\averageflux}[2]{\ensuremath{\bar{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\interfaceflux}[2]{\ensuremath{\tilde{\vctr f}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\transmissivity}[1]{\ensuremath{\chi^{(#1)}}}
|
||||
\newcommand{\galpha}{\ensuremath{\gamma^{(\alpha)}}}
|
||||
\newcommand{\dotgalpha}{\ensuremath{\dot{\gamma}^{(\alpha)}}}
|
||||
\newcommand{\taualpha}{\ensuremath{\tau^{(\alpha)}}}
|
||||
\newcommand{\taualphamax}{\ensuremath{\hat\tau^{(\alpha)}}}
|
||||
\newcommand{\density}[2]{\ensuremath{\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityfunc}[2]{\ensuremath{{\tilde\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\avgdensity}[2]{\ensuremath{{\bar\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\dotdensity}[2]{\ensuremath{\dot{\varrho}^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\densityexcess}[2]{\ensuremath{\Delta\varrho^{(#1)}_ \text{#2}}}
|
||||
\newcommand{\cs}[2][]{\ensuremath{\sigma^{(#1)}_ \text{#2}}}
|
||||
|
||||
|
||||
|
||||
|
||||
%% Title, authors and addresses
|
||||
|
||||
%% use the tnoteref command within \title for footnotes;
|
||||
%% use the tnotetext command for theassociated footnote;
|
||||
%% use the fnref command within \author or \address for footnotes;
|
||||
%% use the fntext command for theassociated footnote;
|
||||
%% use the corref command within \author for corresponding author footnotes;
|
||||
%% use the cortext command for theassociated footnote;
|
||||
%% use the ead command for the email address,
|
||||
%% and the form \ead[url] for the home page:
|
||||
%% \title{Title\tnoteref{label1}}
|
||||
%% \tnotetext[label1]{}
|
||||
%% \author{Name\corref{cor1}\fnref{label2}}
|
||||
%% \ead{email address}
|
||||
%% \ead[url]{home page}
|
||||
%% \fntext[label2]{}
|
||||
%% \cortext[cor1]{}
|
||||
%% \address{Address\fnref{label3}}
|
||||
%% \fntext[label3]{}
|
||||
|
||||
\title{Implement a remeshing scheme into a spectral method based crystal plasticity code}
|
||||
|
||||
%% use optional labels to link authors explicitly to addresses:
|
||||
%% \author[label1,label2]{}
|
||||
%% \address[label1]{}
|
||||
%% \address[label2]{}
|
||||
|
||||
\author{M.~Diehl}
|
||||
|
||||
%% \linenumbers
|
||||
|
||||
% main text
|
||||
\begin{document}
|
||||
\maketitle
|
||||
% ----------------------------------------------------------------------------------------------------------------------------
|
||||
At MPIE, the flexible crystal plasticity framework ``Düsseldorf Advanced MAterial Simulation Kit'' (DAMASK) is developed.
|
||||
It consists of different constitutive models, homogenization schemes, and tools for post- and preprocessing \cite{Roters_etal2010}.
|
||||
It has interfaces to different solvers to the mechanical boundary value problem.
|
||||
To compute the boundary value problem, commercial FEM software like MSC.Marc or Abaqus or a solver based on a so-called spectral method \cite{Moulinec+Suquet1998,Lebensohn2001}.
|
||||
Spectral methods have advantages concerning accuracy, performance, and memory efficiency compared to the de-facto standard FEM.
|
||||
However, their use is limited to periodic boundary conditions due to the approximation of the solution by plane waves.
|
||||
The spectral method implemented at MPIE uses a finite-strain formulation proposed in \cite{Lahellec_etal2001} that is written in terms of deformation gradient \tnsr F and Piola--Kirchhoff stress \tnsr P and can therefore be used to solve the mechanical boundary value problem in the reference configuration.
|
||||
Calculations have shown that for inhomogeneous material convergence cannot be achieved any longer at strains larger than ca.~15--20 \%.
|
||||
We presently believe that this is due to the fact that the regular mesh in the reference configuration is locally heavily deformed to an extent where single points cross the path of neighboring points.
|
||||
To reach higher strains, a remeshing scheme should be implemented as follows.\begin{enumerate}
|
||||
\item Write out the current state
|
||||
\item Approximate the deformed configuration by a regular (undeformed, new) mesh
|
||||
\item Translate the old state values to the new mesh
|
||||
\end{enumerate}
|
||||
\bibliographystyle{unsrtnat}
|
||||
\bibliography{Masterthesis}
|
||||
\end{document}
|
||||
\endinput
|
|
@ -0,0 +1,40 @@
|
|||
To use the spectral method, a Fortran compiler must be installed.
|
||||
For post an prepocessing, a running python enviroment with numpy must be installed.
|
||||
|
||||
Currently the Intel Fortran compiler and the GNU Fortran compiler are supported.
|
||||
The compilation of the code is automated by using make.
|
||||
There are several options to tune the compilation in detail
|
||||
The most important switch is "F90" to choose the Fortran compiler.
|
||||
It can be set to "ifort" (Intel Fortran compiler) or "gfortran" (GNU compiler).
|
||||
E.g. "make F90=gfortran"
|
||||
Multiprocessor support can be switched off by setting "OPENMP=OFF" (default "OPENMP=ON").
|
||||
The compiler switches are explained in detail in the makefile in %DAMASK%/code
|
||||
A "make clean" removes all previously compiled code.
|
||||
|
||||
If the compilation was succesfull, a file called DAMASK_spectral.exe is found in %DAMASK%/code.
|
||||
If multiprocessor support is enabled (default), the number of threads can be set to N by setting "DAMASK_NUM_THREADS".
|
||||
E.g. "export DAMASK_NUM_THREADS=4" for using four cores.
|
||||
The number of processors can be shown by "echo $DAMASK_NUM_THREADS"
|
||||
|
||||
To run the application in the directory containing loadcase, geometry and *.config files, type %DAMASK%/code/DAMASK_spectral.exe geomfile.geom loadcasefile.load
|
||||
|
||||
To create geomtry file, use the tools for voronoi tesselation provided in %DAMASK%/processing/pre
|
||||
At first, install all processing tools by running %DAMASK%/processing/setup/setup_processing.py
|
||||
!Be carefull, change "ifort" to your compiler name in "os.system('ifort -O3 -parallel -o%s.exe %s'%(os.path.splitext(src)[0],src))" in that file
|
||||
!And change f90flags="-heap-arrays 500000000" to f90flags="" in "%DAMASK%/processing/post/make_postprocessingMath" for non-Intel compiler
|
||||
If the post- and preprocessing are correctly installed, you have the file "voronoi_randomSeeding.exe" and "voronoi_tessellation.exe" in "%DAMASK%/processing/pre"
|
||||
To generate random seeds, run "voronoi_randomSeeding.exe" an follow the instructions on the screen.
|
||||
You will get a file called *.seeds in your working directory
|
||||
With the *.seeds file, you can generate geometry files at different resolution and dimensionby running "voronoi_randomSeeding.exe" in "%DAMASK%/processing/pre"
|
||||
You will get three files called *.spectral, *.geom, *.config .
|
||||
Ingnore the first one.
|
||||
Rename the file *.config to "material.config".
|
||||
This file conatines the information about the orientation of each grain in the generated microstructure.
|
||||
It DOES NOT contain any information about the constitutive model that should be used.
|
||||
Copy that information from %DAMASK%/code/config/material.config
|
||||
A valid "material.config" contains at least one <homogenization> scheme, a <microstructure> for each grain, at leat one <texture>, a <crystallite> and at leat one <phase>
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue