135 lines
3.1 KiB
Python
135 lines
3.1 KiB
Python
import datetime
|
|
|
|
import lmfit as lm
|
|
import numpy as np
|
|
import pandas as pd
|
|
import scipy.special as sf
|
|
from bson import ObjectId
|
|
from scipy.optimize import curve_fit
|
|
|
|
from paveit.datamodels import CITTSiffnessResults, RegCITT
|
|
|
|
|
|
def temp_freq_equivalence(T, f, phi, T0=20.0):
|
|
|
|
alphaT = np.exp(phi * ((1 / (T + 273.15)) - (1 / (T0 + 273.15))))
|
|
x = np.log(f * alphaT) / np.log(10)
|
|
|
|
return x
|
|
|
|
def stiffness_tp26(T, f, phi, Emax, Emin, z0, z1, T0=20.0):
|
|
|
|
x = temp_freq_equivalence(T, f, phi, T0)
|
|
|
|
E = Emin + (Emax - Emin) / (1 + np.exp(z1 * x + z0))
|
|
|
|
return E
|
|
|
|
|
|
def calc_nu(T):
|
|
#TODO: Prüfen ob Formel stimmt!
|
|
nu = 0.15 + (0.35) / (1 + np.exp(3.1849 - 0.04233 * (9 / 5 * T + 32)))
|
|
return nu
|
|
|
|
|
|
def citt(task_id: str):
|
|
"""
|
|
Postprocessing task
|
|
"""
|
|
|
|
print('postprocessing')
|
|
|
|
task_id = ObjectId(task_id)
|
|
|
|
# read all data
|
|
data = []
|
|
parlist = ['f_set', 'T_set', 'stiffness', 'phase']
|
|
|
|
for obj in CITTSiffnessResults.objects(task_id=task_id).only(*parlist):
|
|
data.append(dict((k, obj[k]) for k in parlist ))
|
|
|
|
data = pd.DataFrame.from_records(data)
|
|
|
|
#Emax/Emin
|
|
line_mod = lm.models.LinearModel()
|
|
out = line_mod.fit(data.stiffness, x=data.phase)
|
|
|
|
Emax = line_mod.eval(out.params, x=0.0)
|
|
|
|
Emin = 0
|
|
|
|
assert Emin < Emax
|
|
|
|
# Fit data
|
|
mod = lm.models.Model(stiffness_tp26, independent_vars=['f','T'])
|
|
|
|
mod.set_param_hint(
|
|
'Emin',
|
|
value=Emin,
|
|
min=0,
|
|
max=0.9*Emax,
|
|
vary=True,
|
|
)
|
|
|
|
mod.set_param_hint(
|
|
'Emax',
|
|
value=Emax,
|
|
min=0.9*Emax,
|
|
max=1.1*Emax,
|
|
vary=True,
|
|
)
|
|
|
|
mod.set_param_hint(
|
|
'T0',
|
|
value=20.0,
|
|
vary=False,
|
|
)
|
|
|
|
mod.set_param_hint('phi', value=25000, min=15000, max=35000, vary=True)
|
|
mod.set_param_hint('z0', value=1,min=1e-10, max=1000., vary=True)
|
|
mod.set_param_hint('z1', value=-1, min=-1000., max=-1e-10, vary=True)
|
|
|
|
parms_fit = [
|
|
mod.param_hints['Emin']['value'], mod.param_hints['Emax']['value'],
|
|
mod.param_hints['phi']['value'], mod.param_hints['z0']['value'],
|
|
mod.param_hints['z1']['value']
|
|
]
|
|
|
|
|
|
## run fit
|
|
results = []
|
|
r2 = []
|
|
|
|
|
|
try:
|
|
methods = ['leastsq', 'powell']
|
|
|
|
for method in methods:
|
|
result = mod.fit(data.stiffness, T=data.T_set, f=data.f_set, method=method, verbose=False)
|
|
|
|
r2temp = 1.0 - result.redchi / np.var(data.stiffness.values, ddof=2)
|
|
r2.append(r2temp)
|
|
|
|
results.append(result)
|
|
|
|
best = np.nanargmax(r2)
|
|
|
|
res = results[best].best_values
|
|
res['stat_r2'] = r2[best]
|
|
|
|
except:
|
|
print('error regression, send default values')
|
|
|
|
res = mod.valuesdict()
|
|
|
|
#add metadata
|
|
res['nsamples'] = len(data)
|
|
res['task_id'] = task_id
|
|
res['date'] = datetime.datetime.now()
|
|
|
|
print(res)
|
|
|
|
# save results to db
|
|
doc = RegCITT.objects(task_id=task_id).modify(upsert=True, **res)
|
|
|
|
return True |