Added a masochistic try to implement EHB's work: PRB 71 014521 (2005)
It is not working at all in the current state and therefore also not included in the library. - 2D calculation seems okay - at least the symmetry of the hexagonal lattice is kept through the iterations - 3D iterations destroy this symmetry... I guess it is only a small problem, however I do not see it right now - EHB's matlab code is available - however, it treats the problem quite differently In case this is ever going to work, some things could probably be more optimal: - Replace the numeric gradient calculation by the "analytical gradient" - Use only every second Fourier coefficient in K-space and keep the number of points This should reduce the factor of redundancy in real space from 8 to 2 and increase the spacial resolution by a factor of 4!
This commit is contained in:
parent
f2bd5b124f
commit
c663446dae
2082
src/external/TFitPofB-lib/classes/TFilmTriVortexFieldCalc.cpp
vendored
Normal file
2082
src/external/TFitPofB-lib/classes/TFilmTriVortexFieldCalc.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
139
src/external/TFitPofB-lib/include/TFilmTriVortexFieldCalc.h
vendored
Normal file
139
src/external/TFitPofB-lib/include/TFilmTriVortexFieldCalc.h
vendored
Normal file
@ -0,0 +1,139 @@
|
||||
/***************************************************************************
|
||||
|
||||
TBulkTriVortexFieldCalc.h
|
||||
|
||||
Author: Bastian M. Wojek
|
||||
e-mail: bastian.wojek@psi.ch
|
||||
|
||||
2010/10/17
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2010 by Bastian M. Wojek *
|
||||
* based upon: *
|
||||
* Ernst Helmut Brandt, Phys. Rev. B 71 014521 (2005) *
|
||||
* *
|
||||
* This program 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; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program 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 this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef _TFilmVortexFieldCalc_H_
|
||||
#define _TFilmVortexFieldCalc_H_
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
using namespace std;
|
||||
|
||||
#include "fftw3.h"
|
||||
|
||||
//--------------------
|
||||
// Base class for any kind of vortex symmetry
|
||||
//--------------------
|
||||
|
||||
class TFilmVortexFieldCalc {
|
||||
|
||||
public:
|
||||
|
||||
TFilmVortexFieldCalc() {}
|
||||
|
||||
virtual ~TFilmVortexFieldCalc();
|
||||
|
||||
virtual vector<float*> DataB() const {return fBout;}
|
||||
virtual void SetParameters(const vector<float>& par) {fParam = par; fGridExists = false;}
|
||||
virtual void CalculateGrid() const = 0;
|
||||
virtual float GetBmin() const;
|
||||
virtual float GetBmax() const;
|
||||
virtual bool GridExists() const {return fGridExists;}
|
||||
virtual void UnsetGridExists() const {fGridExists = false;}
|
||||
virtual unsigned int GetNumberOfSteps() const {return fSteps;}
|
||||
|
||||
protected:
|
||||
vector<float> fParam;
|
||||
unsigned int fSteps; // number of steps, the "unit cell" of the vortex lattice is devided in (in x- and y- direction)
|
||||
unsigned int fStepsZ; // number of layers that should be calculated in z-direction (film slices)
|
||||
mutable fftwf_complex *fFFTin; // Fourier components of omega
|
||||
mutable vector<float*> fBout; // three pointers to Bx, By, Bz; each of these arrays is in row-major order
|
||||
fftwf_plan fFFTplan;
|
||||
bool fUseWisdom;
|
||||
string fWisdom;
|
||||
mutable bool fGridExists;
|
||||
};
|
||||
|
||||
//--------------------
|
||||
// Class for triangular vortex lattice, Minimisation of the GL free energy à la Brandt (PRB 71, 014521 (2005))
|
||||
//--------------------
|
||||
|
||||
class TFilmTriVortexNGLFieldCalc : public TFilmVortexFieldCalc {
|
||||
|
||||
public:
|
||||
|
||||
TFilmTriVortexNGLFieldCalc(const string&, const unsigned int steps = 256, const unsigned int stepsZ = 32);
|
||||
~TFilmTriVortexNGLFieldCalc();
|
||||
|
||||
void CalculateGrid() const;
|
||||
|
||||
fftwf_complex* GetAkMatrix() const {return fFFTin;}
|
||||
fftwf_complex* GetBkMatrix() const {return fBkMatrix;}
|
||||
float* GetOmegaMatrix() const {return fOmegaMatrix;}
|
||||
vector<float*> GetOmegaDiffMatrix() const {return fOmegaDiffMatrix;}
|
||||
fftwf_complex* GetQMatrix() const {return fQMatrix;}
|
||||
fftwf_complex* GetPMatrix() const {return fPkMatrix;}
|
||||
|
||||
private:
|
||||
|
||||
void CalculateGradient() const;
|
||||
void CalculateSumAk() const;
|
||||
void FillAbrikosovCoefficients(const float) const;
|
||||
void ManipulateFourierCoefficientsA() const;
|
||||
void ManipulateFourierCoefficientsB() const;
|
||||
void ManipulateFourierCoefficientsForQx() const;
|
||||
void ManipulateFourierCoefficientsForQy() const;
|
||||
void ManipulateFourierCoefficientsForBperpX() const;
|
||||
void ManipulateFourierCoefficientsForBperpY() const;
|
||||
|
||||
mutable float *fOmegaMatrix;
|
||||
mutable vector<float*> fOmegaDiffMatrix;
|
||||
mutable fftwf_complex *fBkMatrix;
|
||||
mutable fftwf_complex *fPkMatrix;
|
||||
mutable fftwf_complex *fQMatrix;
|
||||
mutable fftwf_complex *fQMatrixA;
|
||||
mutable fftwf_complex *fSumAkFFTin;
|
||||
mutable float *fSumAk;
|
||||
mutable float *fBkS;
|
||||
|
||||
mutable float *fCheckAkConvergence;
|
||||
mutable float *fCheckBkConvergence;
|
||||
|
||||
mutable float fLatticeConstant;
|
||||
mutable float fThickness;
|
||||
mutable float fKappa;
|
||||
mutable float fSumOmegaSq;
|
||||
mutable float fSumSum;
|
||||
mutable float fC;
|
||||
|
||||
mutable bool fFind3dSolution;
|
||||
|
||||
fftwf_plan fFFTplanBkToBandQ;
|
||||
fftwf_plan fFFTplanOmegaToAk;
|
||||
fftwf_plan fFFTplanOmegaToBk;
|
||||
fftwf_plan fFFTplanForSumAk;
|
||||
fftwf_plan fFFTplanForPk1;
|
||||
fftwf_plan fFFTplanForPk2;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // _TFilmTriVortexFieldCalc_H_
|
Loading…
x
Reference in New Issue
Block a user