263
263
! Do we have fluid-particle drag between phases?
264
264
logical :: have_fp_drag
268
type(scalar_field), pointer :: POD_u_scalar !petro
269
type(pod_rhs_type)::pod_rhs_old
270
type(vector_field), pointer :: POD_u
271
real, dimension(:), allocatable :: THETA,smean_gi,KB_pod,b_pod,PSI_GI,PSI_OLD_GI,psi_old,GRADX,GRADT,DIFFGI_pod,PSI
272
real, dimension(:,:), allocatable ::leftsvd,leftsvd_gi,leftsvd_x_gi, AMAT_pod, KMAT_pod
274
!real, dimension(:,:), allocatable :: snapmean_velocity
275
type(element_type), pointer :: x_shape,xf_shape
276
real, dimension(:,:),allocatable ::X_val !for getting the result of detwei
277
real, dimension(:), allocatable :: detwei(:),res(:)
278
real ,dimension(:,:),allocatable :: JJ !(X%dim, mesh_dim(X)),
279
real :: det ! for getting the result of detwei
280
real, dimension(:,:,:), allocatable :: dshape
282
! real, dimension(POD_u%dim,ele_loc(POD_u,ele)) :: X_val !for getting the result of detwei
283
! new added for petro-galerkin
284
integer :: TOTELE,NLOC,NGI,nsvd !,stat
286
type(mesh_type), pointer :: pod_umesh
288
INTEGER ELE,globi,globj,isvd,jsvd,jloc,GI
289
REAL A_STAR_COEF,AX_STAR,P_STAR_POD
295
267
!!for reduced model
296
268
type(vector_field), pointer :: snapmean_velocity
297
269
type(scalar_field), pointer :: snapmean_pressure
1331
print *,"before POD_u"
1332
POD_u=>extract_vector_field(POD_state(1,1,1), "Velocity")
1333
print *,"before POD_u_scalar"
1334
!POD_u_scalar=extract_scalar_field(POD_u,1) !!need modify
1335
POD_num=size(POD_state,1)
1336
print *,"before allocate(X_val"
1337
allocate(X_val(POD_u%dim,ele_loc(POD_u,ele)))
1338
print *,"before allocate JJ"
1339
allocate(JJ(POD_u%dim,mesh_dim(POD_u)))
1340
!allocate(pod_coef(POD_u%dim*POD_num+POD_num))
1341
pod_umesh => extract_mesh(pod_state(1,1,1), "Mesh", stat)
1342
TOTELE=pod_umesh%elements
1343
NLOC=pod_umesh%shape%loc
1344
NGI=pod_umesh%shape%ngi
1345
print *,"before allocate rhs_old"
1346
call allocate(pod_rhs_old, POD_u, POD_pressure)
1348
xf_shape=>ele_shape(POD_u,1)
1349
x_shape=>ele_shape(POD_u,1)
1350
print *, "timestep,, 2+++"
1352
!POD_u_scalar=>extract_scalar_field(POD_state(j), "PODPressure")
1353
!POD_u_scalar=extract_scalar_field(POD_u,j)
1354
X_val=ele_val(POD_u, j)
1355
xf_shape=>ele_shape(Pod_u,j) !!
1356
x_shape=>ele_shape(POD_u,j)!!
1358
!!new added for petro-galerkin
1361
! allocate(pod_sol_velocity(u_nodes,POD_velocity%dim))
1362
allocate(THETA(NGI))
1363
allocate(leftsvd(TOTELE*NLOC+NLOC,nsvd))
1364
allocate(leftsvd_gi(NGI,nsvd))
1365
allocate(leftsvd_x_gi(NGI,nsvd))
1366
allocate(smean_gi(NGI))
1367
allocate(AMAT_pod(nsvd,nsvd))
1368
allocate(KMAT_pod(nsvd,nsvd))
1369
allocate(KB_pod(nsvd))
1370
allocate(b_pod(nsvd))
1371
allocate(PSI(TOTELE*NLOC+NLOC))
1372
allocate(PSI_GI(NGI))
1373
allocate(PSI_OLD_GI(NGI))
1374
allocate(psi_old(TOTELE*NLOC+NLOC))
1375
allocate(GRADX(NGI))
1376
allocate(GRADT(NGI))
1377
allocate(DIFFGI_pod(NGI))
1378
allocate(detwei(NGI))
1382
! allocate(dshape(noloc,nogas,POD_u%dim))
1383
allocate(dshape(x_shape%loc,x_shape%ngi,POD_u%dim)) !number of nodes, NO. of gussian
1386
! new added for petro-galerkin Residual, see Non-Linear Petrov-Galerkin Methods for
1387
! Hyperbolic Equations and Discontinuous Finite Element Methods .. eqn 102
1388
! get the result of Residual value"
1390
pod_rhs_old%val=pod_rhs%val
1391
call solve(pod_matrix%val, pod_rhs%val)
1392
! pod_coef=pod_rhs%val
1393
pod_rhs%val=pod_rhs%val-pod_rhs_old%val
1394
call SMLINN(pod_matrix%val,RES,pod_rhs%val,GI,GI) ! get the RES
1401
call transform_to_physical(POD_u, ele, ele_shape(POD_u,1), detwei=detwei, dshape=dshape)
1402
DO GI=1,NGI ! guassian points' number
1403
DO JLOC=1,NLOC ! NLOC points in one element
1404
GLOBJ=(ELE-1)*NLOC+JLOC
1407
leftsvd(GLOBJ,isvd)=POD_u%val(GLOBJ,isvd)
1408
leftsvd_gi(GI,isvd)=leftsvd_gi(GI,isvd)+xf_shape%dn(isvd,GI,1)*leftsvd(GLOBJ,isvd)
1409
!N shape function, leftsvd: podbasis, N(JLOC,GI): ele_shape(nu, ele)
1410
leftsvd_x_gi(GI,isvd)=leftsvd_gi(GI,isvd)+dshape(JLOC,GI,1)*leftsvd(GLOBJ,isvd)
1412
!smean_gi(gi)=smean_gi(gi)+ 1SMLINN(A,X,B,NMX,N)*smean(GLOBJ) !need modification
1413
!smean_gi(gi)=smean_gi(gi)+ 1*smean(GLOBJ)
1418
PSI_GI=0.0 ! quadrature point
1423
GLOBJ=(ELE-1)*NLOC+JLOC
1424
PSI_GI(GI)=PSI_GI(GI)+xf_shape%dn(isvd,GI,1)*PSI(GLOBJ)
1425
PSI_OLD_GI(GI)=PSI_OLD_GI(GI)+xf_shape%dn(isvd,GI,1)*PSI_OLD(GLOBJ)
1430
! calculate the GRADX and GRADT quadrature point
1433
DO GI=1,NGI ! ?? NGI and NLOC need input
1435
GLOBJ=(ELE-1)*NLOC+JLOC
1436
PSI_THETA=THETA(GI)*PSI(GLOBJ)+(1.-THETA(GI))*PSI_OLD(GLOBJ)
1438
GRADX(GI)=GRADX(GI)+dshape(JLOC,GI,1)*PSI_THETA
1439
GRADT(GI)=GRADT(GI)+xf_shape%dn(isvd,GI,1)*(PSI(GLOBJ)-PSI_OLD(GLOBJ))/DT1
1443
! get the result of AX_STAR cos P_STAR_POD need it
1446
A_STAR_COEF=(GRADX(GI)+GRADT(GI)*1.) &
1447
/MAX(1.E-6,GRADX(GI)**2+1.*GRADT(GI)**2)
1448
! AT_STAR=A_STAR_COEF*GRADT(GI)
1449
AX_STAR=A_STAR_COEF*GRADX(GI)
1454
P_STAR_POD = 0.25/abs(AX_STAR*leftsvd_x_gi(GI,isvd))
1456
P_STAR_POD = 0.25/max(P_STAR_POD,abs(AX_STAR*leftsvd_x_gi(GI,isvd)))
1459
DIFFGI_pod(GI) = 1.0e-4*P_STAR_POD*RES(GI)**2 &
1460
/ MAX(1.E-6,GRADX(GI)**2+GRADT(GI)**2)!!v_pod (eqn.100)
1466
KMAT_pod(isvd,jsvd) = KMAT_pod(isvd,jsvd) &
1467
+ detwei(GI)*leftsvd_x_gi(GI,isvd)*DIFFGI_pod(GI)*leftsvd_x_gi(GI,jsvd)
1468
! (eqn.99 left side,leftsvd_x_gi:delta N)
1478
!pod_rhs%val=0.001*pod_rhs%val
1479
! add K to (MT AM + K) fi *pod= MT b.
1483
pod_matrix%val(isvd,jsvd) = pod_matrix%val(isvd,jsvd)+KMAT_pod(isvd,jsvd)
1485
!b_pod(isvd) = b_pod(isvd)-KB_pod(isvd)
1488
call solve(pod_matrix%val,pod_rhs_old%val)
1489
pod_rhs%val=pod_rhs_old%val
1491
call solve(pod_matrix%val,pod_rhs%val)
1492
! print *, 'size(pod_rhs%val)size(pod_rhs%val)size(pod_rhs%val)', size(pod_rhs%val)
1494
! call solve(pod_matrix%val, pod_rhs%val)
1301
call solve(pod_matrix%val, pod_rhs%val)
1495
1302
pod_coef_dt=0.0
1496
1303
pod_coef_dt=pod_rhs%val
1497
1304
pod_rhs%val=0.0