2dBoundaryLayerExample/calc_earsm.py

167 lines
5.0 KiB
Python
Raw Normal View History

2026-04-24 13:14:31 +02:00
def calc_earsm(k2d,om2d,u2d_face_w,u2d_face_s,v2d_face_w,v2d_face_s,uu2d,uv2d,vv2d,ww2d,vis2d_earsm):
from joblib import dump, load
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
global neural_net,pk_min, pk_max,scaler_yplus, scaler_pk,yplus_min, yplus_max, beta1_min, beta4_min, beta1_max, beta4_max, dudy,ttau,pk,vis2d_earsm1, beta2_min, beta2_max
if iter == 0:
print('NN calc_earsm called')
folder='../NN/'
# load data
filename=str(folder)+'model.pth'
neural_net = torch.load(filename,weights_only=False)
print('model',neural_net)
scaler_pk = load(str(folder)+'model-scaler-pk.bin')
scaler_yplus = load(str(folder)+'model-scaler-yplus.bin')
beta1_min, beta1_max, beta2_min, beta2_max, beta4_min, beta4_max, pk_min, pk_max, yplus_min, yplus_max = np.loadtxt(str(folder)+'min-max.txt')
# beta1_max = -0.08
# beta2_min = 0.03
# beta4_max = -0.04
print('pk_min, pk_max',pk_min, pk_max, yplus_min, yplus_max)
print('beta1_min, beta1_max',beta1_min, beta1_max)
print('beta2_min, beta2_max',beta2_min, beta2_max)
print('beta4_min, beta4_max',beta4_min, beta4_max)
vis2d_earsm = vis2d
dudx=dphidx(u2d_face_w,u2d_face_s)
dudy=dphidy(u2d_face_w,u2d_face_s)
dvdx=dphidx(v2d_face_w,v2d_face_s)
dvdy=dphidy(v2d_face_w,v2d_face_s)
diss=0.09*k2d*om2d
rk=k2d
ttau=np.maximum(rk/diss,6*(viscos/diss)**0.5)
s11=ttau*dudx
s12=ttau*0.5*(dudy+dvdx)
s21=s12
s22=ttau*dvdy
om12=ttau*0.5*(dudy-dvdx)
om21=-om12
om22=0.
om11=0.
s11=ttau*dudx
s12=ttau*0.5*(dudy+dvdx)
s21=s12
s22=ttau*dvdy
II_S=(s11**2+s12**2+s21**2+s22**2) # s_ij s_ji = s_ij s_ij
vist = vis2d_earsm-viscos
# vist = vis2d-viscos
# vist = k2d/om2d
uv_tot = uv2d - vist*(dudy+dvdx)
# if iter == 0:
# if iter % 100 == 0:
pk = vist*dudy**2*viscos
# pk = -uv_tot*dudy*viscos
yplus = dist/viscos
# limit min/max
# count values larger/smaller than max/min
pk_min_number= (pk < pk_min).sum()
pk_max_number= (pk > pk_max).sum()
print('pk_min_number',pk_min_number)
print('pk_max_number',pk_max_number)
yplus_min_number= (yplus< yplus_min).sum()
yplus_max_number= (yplus > yplus_max).sum()
print('yplus_min_number',yplus_min_number)
print('yplus_max_number',yplus_max_number)
# set limits
pk=np.minimum(pk,pk_max)
pk=np.maximum(pk,pk_min)
yplus=np.minimum(yplus,yplus_max)
yplus=np.maximum(yplus,yplus_min)
# re-shape
pk_org = pk
pk = pk.reshape(-1,1)
yplus= yplus.reshape(-1,1)
X=np.zeros((nj,2))
X[:,0] = scaler_pk.transform(pk)[:,0]
X[:,1] = scaler_yplus.transform(yplus)[:,0]
X_tensor = torch.tensor(X, dtype=torch.float32)
preds = neural_net(X_tensor)
#transform from tensor to numpy
c_NN = preds.detach().numpy()
beta1=c_NN[:,0]
beta2=c_NN[:,1]
beta4=c_NN[:,2]
beta1 = np.reshape(beta1,(ni,nj))
beta2 = np.reshape(beta2,(ni,nj))
beta4 = np.reshape(beta4,(ni,nj))
# limit min/max
# count values larger/smaller than max/min
beta1_min_number= (beta1< beta1_min).sum()
beta1_max_number= (beta1> beta1_max).sum()
print('beta1_min_number',beta1_min_number)
print('beta1_max_number',beta1_max_number)
beta4_min_number= (beta4< beta4_min).sum()
beta4_max_number= (beta4> beta4_max).sum()
print('beta4_min_number',beta4_min_number)
print('beta4_max_number',beta4_max_number)
# set limits
beta1=np.minimum(beta1,beta1_max)
beta1=np.maximum(beta1,beta1_min)
beta2=np.minimum(beta2,beta2_max)
beta2=np.maximum(beta2,beta2_min)
beta4=np.minimum(beta4,beta4_max)
beta4=np.maximum(beta4,beta4_min)
# uu=rk*beta4*(s12*om21-om12*s21) # +rk*beta1*s11; this is included via vis_earsm
# vv=rk*beta4*(s21*om12-om21*s12) # +rk*beta1*s22; this is included via vis_earsm
uu=rk*(beta4*(s12*om21-om12*s21)+beta2*(s11**2+s12**2-II_S/3)) # = a_11; 2/3*dk/dx_1 is omitted. It only affect the pressure
vv=rk*(beta4*(s21*om12-om21*s12)+beta2*(s22**2+s12**2-II_S/3)) # = a_22; 2/3*dk/dx_2 is omitted. It only affect the pressure
ww=-rk*beta2*II_S/3
uu = np.maximum(uu+0.6666*k2d,0)-0.6666*k2d
vv = np.maximum(vv+0.6666*k2d,0)-0.6666*k2d
# ww = np.maximum(ww+0.6666*k2d,0)-0.6666*k2d
uv = rk*beta4*(s11*om12-om12*s22) #+rk*beta1*s12 # this is included via vis_earsm
vis2d_earsm_old= vis2d_earsm
vis2d_earsm=-0.5*rk*beta1*ttau+viscos
uu2d = urfvis*uu+(1-urfvis)*uu2d
uv2d = urfvis*uv+(1-urfvis)*uv2d
vv2d = urfvis*vv+(1-urfvis)*vv2d
ww2d = urfvis*ww+(1-urfvis)*ww2d
vis2d_earsm=urfvis*vis2d_earsm+(1-urfvis)*vis2d_earsm_old
vis2d_earsm1= vis2d_earsm
if iter % 100 == 0:
np.save('beta1_saved', beta1)
np.save('beta2_saved', beta2)
np.save('beta4_saved', beta4)
np.save('diss_saved', diss)
np.save('pk_saved', pk_org)
return uu2d,vv2d,ww2d,uv2d,vis2d_earsm