/*************************************************************************** TBofZCalc.h Author: Bastian M. Wojek e-mail: bastian.wojek@psi.ch 2009/04/25 ***************************************************************************/ #ifndef _TBofZCalc_H_ #define _TBofZCalc_H_ #include using namespace std; //-------------------- // Base class for any kind of theory function B(z) //-------------------- class TBofZCalc { public: TBofZCalc() {} virtual ~TBofZCalc() { fZ.clear(); fBZ.clear(); fParam.clear(); } virtual vector DataZ() const {return fZ;} virtual vector DataBZ() const {return fBZ;} virtual void Calculate(); virtual double GetBofZ(double) const = 0; virtual double GetBmin() const = 0; virtual double GetBmax() const = 0; double GetDZ() const {return fDZ;} protected: int fSteps; double fDZ; vector fParam; vector fZ; vector fBZ; }; //-------------------- // Base class for any kind of theory function B(z) where the inverse and its derivative are given analytically //-------------------- class TBofZCalcInverse : public TBofZCalc { public: TBofZCalcInverse() {} virtual ~TBofZCalcInverse() {} virtual vector< pair > GetInverseAndDerivative(double) const = 0; }; //-------------------- // Class "for Meissner screening" in a superconducting half-space //-------------------- class TLondon1D_HS : public TBofZCalcInverse { public: TLondon1D_HS(const vector&, unsigned int steps = 3000); double GetBofZ(double) const; double GetBmin() const; double GetBmax() const; vector< pair > GetInverseAndDerivative(double) const; }; //-------------------- // Class "for Meissner screening" in a thin superconducting film //-------------------- class TLondon1D_1L : public TBofZCalcInverse { public: TLondon1D_1L(const vector&, unsigned int steps = 3000); double GetBofZ(double) const; double GetBmin() const; double GetBmax() const; vector< pair > GetInverseAndDerivative(double) const; private: void SetBmin(); double fMinZ; double fMinB; double fCoeff[2]; }; //-------------------- // Class "for Meissner screening" in a thin superconducting film - bilayer with two different lambdas //-------------------- class TLondon1D_2L : public TBofZCalcInverse { public: TLondon1D_2L(const vector&, unsigned int steps = 3000); double GetBofZ(double) const; double GetBmin() const; double GetBmax() const; vector< pair > GetInverseAndDerivative(double) const; private: void SetBmin(); int fMinTag; double fMinZ; double fMinB; double fInterfaces[3]; double fCoeff[4]; }; //-------------------- // Class "for Meissner screening" in a thin superconducting film - tri-layer with three different lambdas //-------------------- class TLondon1D_3L : public TBofZCalcInverse { public: TLondon1D_3L(const vector&, unsigned int steps = 3000); double GetBofZ(double) const; double GetBmin() const; double GetBmax() const; vector< pair > GetInverseAndDerivative(double) const; private: void SetBmin(); int fMinTag; double fMinZ; double fMinB; double fInterfaces[4]; double fCoeff[6]; }; //-------------------- // Class "for Meissner screening" in a thin superconducting film - tri-layer with two different lambdas //-------------------- class TLondon1D_3LS : public TBofZCalcInverse { public: TLondon1D_3LS(const vector&, unsigned int steps = 3000); double GetBofZ(double) const; double GetBmin() const; double GetBmax() const; vector< pair > GetInverseAndDerivative(double) const; private: void SetBmin(); int fMinTag; double fMinZ; double fMinB; double fInterfaces[4]; double fCoeff[6]; }; // //-------------------- // // Class "for Meissner screening" in a thin superconducting film - four layers with four different lambdas // //-------------------- // // class TLondon1D_4L : public TBofZCalc { // // public: // // TLondon1D_4L(unsigned int, const vector& ); // // }; #endif // _BofZCalc_H_