From dfebbad5b7267d8d78737018809864ac04cd2cba Mon Sep 17 00:00:00 2001
From: Erik Schnaubelt <erik.schnaubelt@cern.ch>
Date: Wed, 26 Feb 2025 10:41:55 +0100
Subject: [PATCH] add Pancake benchmark Jc fit, use with caution (not tested
 yet, and no reference)

---
 all_material_functions.csv                    |  5 +-
 .../c/general/CFUN_HTS_JcFit_Benchmark_v1.c   | 91 +++++++++++++++++++
 2 files changed, 94 insertions(+), 2 deletions(-)
 create mode 100644 models/c/general/CFUN_HTS_JcFit_Benchmark_v1.c

diff --git a/all_material_functions.csv b/all_material_functions.csv
index 3fd1e94..ac44428 100644
--- a/all_material_functions.csv
+++ b/all_material_functions.csv
@@ -74,8 +74,8 @@
 72,CFUN_kHast_v1,TRUE,CFUN_kHast_v1,TRUE,CFUN_kHast_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
 73,CFUN_kHe_v1,FALSE,,FALSE,,,"T, Tref?? Legacy function, I don t think anybody uses it.",2,,,,,,,,,,,,
 74,CFUN_kIn_v0,TRUE,CFUN_kIn_v0,TRUE,CFUN_kIn_v0,Tim Mulder,"T needs cleaning, why v0?, TINY T RANGE PLEASE FIX",1,"np.geomspace(15,300,100)",,,,,,,,,,,
-75,CFUN_kKapton_v1,TRUE,CFUN_kKapton_v1,TRUE,CFUN_kKapton_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
-76,CFUN_kKapton_v2,TRUE,CFUN_kKapton_v2,TRUE,CFUN_kKapton_v2,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
+75,CFUN_kKapton_v1,TRUE,CFUN_kKapton_v1,TRUE,CFUN_kKapton_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,10000)",,,,,,,,,,,
+76,CFUN_kKapton_v2,TRUE,CFUN_kKapton_v2,TRUE,CFUN_kKapton_v2,Tim Mulder,T,1,"np.geomspace(0.1,1000,10000)",,,,,,,,,,,
 77,CFUN_kSteel_v1,TRUE,CFUN_kSteel_v1,TRUE,CFUN_kSteel_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
 78,CFUN_kSteel_v2,TRUE,CFUN_kSteel_v1,FALSE,,,T,1,,,,,,,,,,,,
 79,CFUN_kStycast_v1,TRUE,CFUN_kStycast_v1,TRUE,CFUN_kStycast_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
@@ -98,3 +98,4 @@
 96,CFUN_rhoHast_v2,TRUE,CFUN_rhoHast_v1,FALSE,,,T,1,,,,,,,,,,,,
 97,CFUN_rhoIn_v0,TRUE,CFUN_rhoIn_v0,TRUE,CFUN_rhoIn_v0,Tim Mulder,"T, why v0?, TINY T RANGE",1,"np.geomspace(15,300,100)",,,,,,,,,,,
 98,CFUN_rhoSS_v1,TRUE,CFUN_rhoSS_v1,TRUE,CFUN_rhoSS_v1,Tim Mulder,T,1,"np.geomspace(0.1,1000,100)",,,,,,,,,,,
+99,CFUN_HTS_JcFit_Benchmark_v1,FALSE,,FALSE,,,"B, dev version without testing for now",1,,,,,,,,,,,,
\ No newline at end of file
diff --git a/models/c/general/CFUN_HTS_JcFit_Benchmark_v1.c b/models/c/general/CFUN_HTS_JcFit_Benchmark_v1.c
new file mode 100644
index 0000000..39beb8a
--- /dev/null
+++ b/models/c/general/CFUN_HTS_JcFit_Benchmark_v1.c
@@ -0,0 +1,91 @@
+#include <math.h>
+#include <float.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+#ifdef _MSC_VER
+#define EXPORT __declspec(dllexport)
+#else
+#define EXPORT
+#endif
+
+#define C0 2.5527e+12 // original value from Davide 6.35E+10 divided by fraction of YBCO, which is 0.0249   // A T / m^2
+#define Birr0 274.84 // T
+#define Tirr0 91.317 // K
+#define m 0.7008
+#define p 0.75
+#define q 5.69
+#define nu 0.3323
+#define T 4.2 // K
+#define T_red 0.045993627
+
+static const char *error = NULL;
+
+EXPORT int init(const char *str) {
+  return 1;
+}
+
+EXPORT const char * getLastError() {
+  return error;
+}
+
+EXPORT const char* return_test_yaml() {
+    return "";
+}
+
+double Bc(double T_red_value) {
+    return ((T_red_value > 0 && T_red_value < 1) * (1 - pow(T_red_value, nu)) +
+            (T_red_value <= 0) * 1) * Birr0 +
+           (T_red_value >= 1) * 0.001;
+}
+
+double Jc(double B, double T_red_value) {
+    double Bc_Tred = Bc(T_red_value);
+
+    if (T_red_value < 1 && B < Bc_Tred) {
+        double factor1 = (1 - pow(T_red_value, nu)) * (1 - pow(T_red_value, m));
+        double factor2 = pow((p + q), (p + q)) / (pow(p, p) * pow(q, q));
+        double factor3 = pow(B / Bc_Tred, p) * pow(1 - (B / Bc_Tred), q);
+
+        return (C0 / B) * factor1 * factor2 * factor3;
+    } else {
+        return pow(10, -3);
+    }
+}
+
+EXPORT int eval(const char *func,
+                int nArgs,
+                const double **inReal,
+                const double **inImag,
+                int blockSize,
+                double *outReal,
+                double *outImag) {
+ 
+	if (nArgs != 1) {
+        // Bnorm_IN
+        error = "one argument expected";
+        return 0;
+	}
+	
+
+	// Parfor loop
+	for (int i = 0; i < blockSize; i++) {
+
+		double Bnorm_IN = inReal[0][i];
+
+		outReal[i] = Jc(Bnorm_IN, T_red);
+
+		//Consistency check: output
+		if(outReal[i] != outReal[i]){
+			error = "Output is nan"; 
+			return 0;	  
+		}
+		
+		if (fabs(outReal[i])>DBL_MAX){
+			error = "Output is inf"; 
+			return 0;	  
+		}
+	}
+	
+	return 1;
+}
\ No newline at end of file
-- 
GitLab