#include "models.h"

/* model definitions */
Internal& gsfc15evs() {
	static Internal model("gsfc15evs");
	return model;
}

Internal& vip4() {
	static Internal model("vip4");
	return model;
}

Internal& v117ev() {
	static Internal model("v117ev");
	return model;
}

Internal& gsfc15ev() {
	static Internal model("gsfc15ev");
	return model;
}

Internal& gsfc13ev() {
	static Internal model("gsfc13ev");
	return model;
}

Internal& vipal() {
	static Internal model("vipal");
	return model;
}

Internal& jpl15evs() {
	static Internal model("jpl15evs");
	return model;
}

Internal& u17ev() {
	static Internal model("u17ev");
	return model;
}

Internal& jrm09() {
	static Internal model("jrm09");
	return model;
}

Internal& o6() {
	static Internal model("o6");
	return model;
}

Internal& o4() {
	static Internal model("o4");
	return model;
}

Internal& sha() {
	static Internal model("sha");
	return model;
}

Internal& p11a() {
	static Internal model("p11a");
	return model;
}

Internal& jrm33() {
	static Internal model("jrm33");
	return model;
}

Internal& vit4() {
	static Internal model("vit4");
	return model;
}

Internal& isaac() {
	static Internal model("isaac");
	return model;
}

Internal& jpl15ev() {
	static Internal model("jpl15ev");
	return model;
}

Internal& spv() {
	static Internal model("spv");
	return model;
}

Internal& soi() {
	static Internal model("soi");
	return model;
}

Internal& v2() {
	static Internal model("v2");
	return model;
}

Internal& cassini3() {
	static Internal model("cassini3");
	return model;
}

Internal& cassini5() {
	static Internal model("cassini5");
	return model;
}

Internal& z3() {
	static Internal model("z3");
	return model;
}

Internal& burton2009() {
	static Internal model("burton2009");
	return model;
}

Internal& v1() {
	static Internal model("v1");
	return model;
}

Internal& cassini11() {
	static Internal model("cassini11");
	return model;
}

Internal& p1184() {
	static Internal model("p1184");
	return model;
}

Internal& p11as() {
	static Internal model("p11as");
	return model;
}

Internal& kivelson2002b() {
	static Internal model("kivelson2002b");
	return model;
}

Internal& kivelson2002a() {
	static Internal model("kivelson2002a");
	return model;
}

Internal& kivelson2002c() {
	static Internal model("kivelson2002c");
	return model;
}

Internal& weber2022dip() {
	static Internal model("weber2022dip");
	return model;
}

Internal& weber2022quad() {
	static Internal model("weber2022quad");
	return model;
}

Internal& mh2014() {
	static Internal model("mh2014");
	return model;
}

Internal& cain2003() {
	static Internal model("cain2003");
	return model;
}

Internal& langlais2019() {
	static Internal model("langlais2019");
	return model;
}

Internal& gao2021() {
	static Internal model("gao2021");
	return model;
}

Internal& igrf1935() {
	static Internal model("igrf1935");
	return model;
}

Internal& igrf2005() {
	static Internal model("igrf2005");
	return model;
}

Internal& igrf2000() {
	static Internal model("igrf2000");
	return model;
}

Internal& igrf1950() {
	static Internal model("igrf1950");
	return model;
}

Internal& igrf1960() {
	static Internal model("igrf1960");
	return model;
}

Internal& igrf1985() {
	static Internal model("igrf1985");
	return model;
}

Internal& igrf1945() {
	static Internal model("igrf1945");
	return model;
}

Internal& igrf1965() {
	static Internal model("igrf1965");
	return model;
}

Internal& igrf1905() {
	static Internal model("igrf1905");
	return model;
}

Internal& igrf2010() {
	static Internal model("igrf2010");
	return model;
}

Internal& igrf2020() {
	static Internal model("igrf2020");
	return model;
}

Internal& igrf1910() {
	static Internal model("igrf1910");
	return model;
}

Internal& igrf1990() {
	static Internal model("igrf1990");
	return model;
}

Internal& igrf2015() {
	static Internal model("igrf2015");
	return model;
}

Internal& igrf1925() {
	static Internal model("igrf1925");
	return model;
}

Internal& igrf2025() {
	static Internal model("igrf2025");
	return model;
}

Internal& igrf1970() {
	static Internal model("igrf1970");
	return model;
}

Internal& igrf1930() {
	static Internal model("igrf1930");
	return model;
}

Internal& igrf1920() {
	static Internal model("igrf1920");
	return model;
}

Internal& igrf1955() {
	static Internal model("igrf1955");
	return model;
}

Internal& igrf1995() {
	static Internal model("igrf1995");
	return model;
}

Internal& igrf1900() {
	static Internal model("igrf1900");
	return model;
}

Internal& igrf1980() {
	static Internal model("igrf1980");
	return model;
}

Internal& igrf1940() {
	static Internal model("igrf1940");
	return model;
}

Internal& igrf1975() {
	static Internal model("igrf1975");
	return model;
}

Internal& igrf1915() {
	static Internal model("igrf1915");
	return model;
}

Internal& nmoh() {
	static Internal model("nmoh");
	return model;
}

Internal& gsfco8full() {
	static Internal model("gsfco8full");
	return model;
}

Internal& gsfco8() {
	static Internal model("gsfco8");
	return model;
}

Internal& thebault2018m3() {
	static Internal model("thebault2018m3");
	return model;
}

Internal& anderson2010qts04() {
	static Internal model("anderson2010qts04");
	return model;
}

Internal& uno2009svd() {
	static Internal model("uno2009svd");
	return model;
}

Internal& anderson2012() {
	static Internal model("anderson2012");
	return model;
}

Internal& thebault2018m1() {
	static Internal model("thebault2018m1");
	return model;
}

Internal& anderson2010dts04() {
	static Internal model("anderson2010dts04");
	return model;
}

Internal& anderson2010q() {
	static Internal model("anderson2010q");
	return model;
}

Internal& anderson2010d() {
	static Internal model("anderson2010d");
	return model;
}

Internal& anderson2010qsha() {
	static Internal model("anderson2010qsha");
	return model;
}

Internal& anderson2010dsha() {
	static Internal model("anderson2010dsha");
	return model;
}

Internal& ness1975() {
	static Internal model("ness1975");
	return model;
}

Internal& uno2009() {
	static Internal model("uno2009");
	return model;
}

Internal& anderson2010r() {
	static Internal model("anderson2010r");
	return model;
}

Internal& thebault2018m2() {
	static Internal model("thebault2018m2");
	return model;
}

Internal& ah5() {
	static Internal model("ah5");
	return model;
}

Internal& gsfcq3full() {
	static Internal model("gsfcq3full");
	return model;
}

Internal& gsfcq3() {
	static Internal model("gsfcq3");
	return model;
}

Internal& umoh() {
	static Internal model("umoh");
	return model;
}


/* map the model names to their model object pointers */
std::map<std::string,InternalFunc> getModelPtrMap() {
	static std::map<std::string,InternalFunc> modelPtrMap = {
										{"gsfc15evs",gsfc15evs},
										{"vip4",vip4},
										{"v117ev",v117ev},
										{"gsfc15ev",gsfc15ev},
										{"gsfc13ev",gsfc13ev},
										{"vipal",vipal},
										{"jpl15evs",jpl15evs},
										{"u17ev",u17ev},
										{"jrm09",jrm09},
										{"o6",o6},
										{"o4",o4},
										{"sha",sha},
										{"p11a",p11a},
										{"jrm33",jrm33},
										{"vit4",vit4},
										{"isaac",isaac},
										{"jpl15ev",jpl15ev},
										{"spv",spv},
										{"soi",soi},
										{"v2",v2},
										{"cassini3",cassini3},
										{"cassini5",cassini5},
										{"z3",z3},
										{"burton2009",burton2009},
										{"v1",v1},
										{"cassini11",cassini11},
										{"p1184",p1184},
										{"p11as",p11as},
										{"kivelson2002b",kivelson2002b},
										{"kivelson2002a",kivelson2002a},
										{"kivelson2002c",kivelson2002c},
										{"weber2022dip",weber2022dip},
										{"weber2022quad",weber2022quad},
										{"mh2014",mh2014},
										{"cain2003",cain2003},
										{"langlais2019",langlais2019},
										{"gao2021",gao2021},
										{"igrf1935",igrf1935},
										{"igrf2005",igrf2005},
										{"igrf2000",igrf2000},
										{"igrf1950",igrf1950},
										{"igrf1960",igrf1960},
										{"igrf1985",igrf1985},
										{"igrf1945",igrf1945},
										{"igrf1965",igrf1965},
										{"igrf1905",igrf1905},
										{"igrf2010",igrf2010},
										{"igrf2020",igrf2020},
										{"igrf1910",igrf1910},
										{"igrf1990",igrf1990},
										{"igrf2015",igrf2015},
										{"igrf1925",igrf1925},
										{"igrf2025",igrf2025},
										{"igrf1970",igrf1970},
										{"igrf1930",igrf1930},
										{"igrf1920",igrf1920},
										{"igrf1955",igrf1955},
										{"igrf1995",igrf1995},
										{"igrf1900",igrf1900},
										{"igrf1980",igrf1980},
										{"igrf1940",igrf1940},
										{"igrf1975",igrf1975},
										{"igrf1915",igrf1915},
										{"nmoh",nmoh},
										{"gsfco8full",gsfco8full},
										{"gsfco8",gsfco8},
										{"thebault2018m3",thebault2018m3},
										{"anderson2010qts04",anderson2010qts04},
										{"uno2009svd",uno2009svd},
										{"anderson2012",anderson2012},
										{"thebault2018m1",thebault2018m1},
										{"anderson2010dts04",anderson2010dts04},
										{"anderson2010q",anderson2010q},
										{"anderson2010d",anderson2010d},
										{"anderson2010qsha",anderson2010qsha},
										{"anderson2010dsha",anderson2010dsha},
										{"ness1975",ness1975},
										{"uno2009",uno2009},
										{"anderson2010r",anderson2010r},
										{"thebault2018m2",thebault2018m2},
										{"ah5",ah5},
										{"gsfcq3full",gsfcq3full},
										{"gsfcq3",gsfcq3},
										{"umoh",umoh}
	};
	return modelPtrMap;
}

/***********************************************************************
 * NAME : getModelObjPointer(Model)
 *
 * DESCRIPTION : Function to return a pointer to a model object.
 *		
 * INPUTS : 
 *		std::string Model	Model name (use lower case!).
 *
 * RETURNS :
 *		InternalFunc *ptr		Function pointer to model object.
 *
 **********************************************************************/
InternalFunc getModelObjPointer(std::string Model) {
    std::map<std::string,InternalFunc> modelPtrMap = getModelPtrMap();
	return modelPtrMap[Model];
}

/***********************************************************************
 * NAME : getModelObjPointer(Model)
 *
 * DESCRIPTION : Function to return a pointer to a model object.
 *		
 * INPUTS : 
 *		std::string Model	Model name (use lower case!).
 *
 * RETURNS :
 *		InternalFunc *ptr		Function pointer to model object.
 *
 **********************************************************************/
InternalFunc getModelObjPointer(const char *Model) {
    std::map<std::string,InternalFunc> modelPtrMap = getModelPtrMap();
	return modelPtrMap[Model];
}

/***********************************************************************
 * NAME : listAvailableModels()
 *
 * DESCRIPTION : Function to return a list of model names available.
 *		
 * RETURNS :
 *		vector<string> Models	Model list.
 *
 **********************************************************************/
std::vector<std::string> listAvailableModels() {
	return listMapKeys(getModelPtrMap());
}

/* map of strings to direct field model function pointers */
std::map<std::string,modelFieldPtr> getModelFieldPtrMap() {
	static std::map<std::string,modelFieldPtr> modelFieldPtrMap = {
													{"gsfc15evs",&gsfc15evsField},
													{"vip4",&vip4Field},
													{"v117ev",&v117evField},
													{"gsfc15ev",&gsfc15evField},
													{"gsfc13ev",&gsfc13evField},
													{"vipal",&vipalField},
													{"jpl15evs",&jpl15evsField},
													{"u17ev",&u17evField},
													{"jrm09",&jrm09Field},
													{"o6",&o6Field},
													{"o4",&o4Field},
													{"sha",&shaField},
													{"p11a",&p11aField},
													{"jrm33",&jrm33Field},
													{"vit4",&vit4Field},
													{"isaac",&isaacField},
													{"jpl15ev",&jpl15evField},
													{"spv",&spvField},
													{"soi",&soiField},
													{"v2",&v2Field},
													{"cassini3",&cassini3Field},
													{"cassini5",&cassini5Field},
													{"z3",&z3Field},
													{"burton2009",&burton2009Field},
													{"v1",&v1Field},
													{"cassini11",&cassini11Field},
													{"p1184",&p1184Field},
													{"p11as",&p11asField},
													{"kivelson2002b",&kivelson2002bField},
													{"kivelson2002a",&kivelson2002aField},
													{"kivelson2002c",&kivelson2002cField},
													{"weber2022dip",&weber2022dipField},
													{"weber2022quad",&weber2022quadField},
													{"mh2014",&mh2014Field},
													{"cain2003",&cain2003Field},
													{"langlais2019",&langlais2019Field},
													{"gao2021",&gao2021Field},
													{"igrf1935",&igrf1935Field},
													{"igrf2005",&igrf2005Field},
													{"igrf2000",&igrf2000Field},
													{"igrf1950",&igrf1950Field},
													{"igrf1960",&igrf1960Field},
													{"igrf1985",&igrf1985Field},
													{"igrf1945",&igrf1945Field},
													{"igrf1965",&igrf1965Field},
													{"igrf1905",&igrf1905Field},
													{"igrf2010",&igrf2010Field},
													{"igrf2020",&igrf2020Field},
													{"igrf1910",&igrf1910Field},
													{"igrf1990",&igrf1990Field},
													{"igrf2015",&igrf2015Field},
													{"igrf1925",&igrf1925Field},
													{"igrf2025",&igrf2025Field},
													{"igrf1970",&igrf1970Field},
													{"igrf1930",&igrf1930Field},
													{"igrf1920",&igrf1920Field},
													{"igrf1955",&igrf1955Field},
													{"igrf1995",&igrf1995Field},
													{"igrf1900",&igrf1900Field},
													{"igrf1980",&igrf1980Field},
													{"igrf1940",&igrf1940Field},
													{"igrf1975",&igrf1975Field},
													{"igrf1915",&igrf1915Field},
													{"nmoh",&nmohField},
													{"gsfco8full",&gsfco8fullField},
													{"gsfco8",&gsfco8Field},
													{"thebault2018m3",&thebault2018m3Field},
													{"anderson2010qts04",&anderson2010qts04Field},
													{"uno2009svd",&uno2009svdField},
													{"anderson2012",&anderson2012Field},
													{"thebault2018m1",&thebault2018m1Field},
													{"anderson2010dts04",&anderson2010dts04Field},
													{"anderson2010q",&anderson2010qField},
													{"anderson2010d",&anderson2010dField},
													{"anderson2010qsha",&anderson2010qshaField},
													{"anderson2010dsha",&anderson2010dshaField},
													{"ness1975",&ness1975Field},
													{"uno2009",&uno2009Field},
													{"anderson2010r",&anderson2010rField},
													{"thebault2018m2",&thebault2018m2Field},
													{"ah5",&ah5Field},
													{"gsfcq3full",&gsfcq3fullField},
													{"gsfcq3",&gsfcq3Field},
													{"umoh",&umohField}
	};
	return modelFieldPtrMap;
}

/* function to return pointer to model field function */

/***********************************************************************
 * NAME : getModelFieldPointer(Model)
 *
 * DESCRIPTION : Function to return a pointer to a wrapper function
 * 			which will provide a single field vector at a single 
 * 			position.
 *		
 * INPUTS : 
 *		std::string Model		Model name (use lower case!).
 *
 * RETURNS :
 *		modelFieldPtr *ptr		Pointer to model wrapper.
 *
 *******************************************************************/
modelFieldPtr getModelFieldPtr(std::string Model) {
    std::map<std::string,modelFieldPtr> modelFieldPtrMap = getModelFieldPtrMap();
    return modelFieldPtrMap[Model];
}

/***********************************************************************
 * NAME : getModelFieldPointer(Model)
 *
 * DESCRIPTION : Function to return a pointer to a wrapper function
 * 			which will provide a single field vector at a single 
 * 			position.
 *		
 * INPUTS : 
 *		const char *Model		Model name (use lower case!).
 *
 * RETURNS :
 *		modelFieldPtr *ptr		Pointer to model wrapper.
 *
 **********************************************************************/
modelFieldPtr getModelFieldPtr(const char *Model) {
    std::map<std::string,modelFieldPtr> modelFieldPtrMap = getModelFieldPtrMap();
    return modelFieldPtrMap[Model];
}

/* functions to directly call each model for a single Cartesian vector (this will be used for tracing) */

/***********************************************************************
 * NAME : XXXXXField(x,y,z,Bx,By,Bz)
 *
 * DESCRIPTION : Model wrapper functions which can be passed to the 
 * 			tracing code. Replace XXXXXX with the name of the model...
 *		
 * INPUTS : 
 *		double	x			x coordinate in planetary radii.
 *		double	y			y coordinate in planetary radii.
 *		double	z			z coordinate in planetary radii.
 *
 * OUTPUTS :
 *		double	*Bx			x component of the field (nT).
 *		double	*By			y component of the field (nT).
 *		double	*Bz			z component of the field (nT).
 * 
 **********************************************************************/
void gsfc15evsField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfc15evs();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void vip4Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = vip4();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void v117evField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = v117ev();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfc15evField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfc15ev();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfc13evField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfc13ev();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void vipalField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = vipal();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void jpl15evsField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = jpl15evs();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void u17evField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = u17ev();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void jrm09Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = jrm09();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void o6Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = o6();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void o4Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = o4();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void shaField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = sha();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void p11aField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = p11a();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void jrm33Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = jrm33();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void vit4Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = vit4();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void isaacField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = isaac();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void jpl15evField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = jpl15ev();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void spvField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = spv();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void soiField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = soi();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void v2Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = v2();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void cassini3Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = cassini3();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void cassini5Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = cassini5();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void z3Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = z3();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void burton2009Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = burton2009();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void v1Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = v1();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void cassini11Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = cassini11();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void p1184Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = p1184();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void p11asField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = p11as();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void kivelson2002bField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = kivelson2002b();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void kivelson2002aField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = kivelson2002a();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void kivelson2002cField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = kivelson2002c();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void weber2022dipField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = weber2022dip();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void weber2022quadField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = weber2022quad();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void mh2014Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = mh2014();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void cain2003Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = cain2003();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void langlais2019Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = langlais2019();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gao2021Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gao2021();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1935Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1935();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2005Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2005();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2000Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2000();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1950Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1950();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1960Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1960();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1985Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1985();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1945Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1945();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1965Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1965();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1905Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1905();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2010Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2010();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2020Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2020();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1910Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1910();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1990Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1990();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2015Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2015();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1925Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1925();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf2025Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf2025();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1970Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1970();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1930Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1930();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1920Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1920();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1955Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1955();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1995Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1995();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1900Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1900();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1980Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1980();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1940Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1940();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1975Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1975();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void igrf1915Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = igrf1915();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void nmohField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = nmoh();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfco8fullField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfco8full();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfco8Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfco8();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void thebault2018m3Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = thebault2018m3();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010qts04Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010qts04();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void uno2009svdField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = uno2009svd();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2012Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2012();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void thebault2018m1Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = thebault2018m1();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010dts04Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010dts04();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010qField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010q();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010dField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010d();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010qshaField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010qsha();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010dshaField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010dsha();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void ness1975Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = ness1975();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void uno2009Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = uno2009();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void anderson2010rField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = anderson2010r();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void thebault2018m2Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = thebault2018m2();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void ah5Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = ah5();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfcq3fullField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfcq3full();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void gsfcq3Field(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = gsfcq3();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

void umohField(double x, double y, double z,
				double *Bx, double *By, double *Bz) {
	Internal model = umoh();
	model.FieldCart(x,y,z,Bx,By,Bz);
}

