12ebaca42Sjeremylt!----------------------------------------------------------------------- 22ebaca42Sjeremylt! 32ebaca42Sjeremylt! Header with common subroutine 42ebaca42Sjeremylt! 52ebaca42Sjeremylt include 't320-basis-f.h' 62ebaca42Sjeremylt!----------------------------------------------------------------------- 72ebaca42Sjeremylt subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 82ebaca42Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 9f1a4e9feSjeremylt! LCOV_EXCL_START 102ebaca42Sjeremylt real*8 ctx 112ebaca42Sjeremylt real*8 u1(1) 122ebaca42Sjeremylt real*8 u2(1) 132ebaca42Sjeremylt real*8 v1(1) 142ebaca42Sjeremylt integer q,ierr 152ebaca42Sjeremylt 162ebaca42Sjeremylt do i=1,q 172ebaca42Sjeremylt v1(i)=u1(i)*(u2(i+q*0)*u2(i+q*3)-u2(i+q*1)*u2(i+q*2)) 182ebaca42Sjeremylt enddo 192ebaca42Sjeremylt 202ebaca42Sjeremylt ierr=0 212ebaca42Sjeremylt end 22f1a4e9feSjeremylt! LCOV_EXCL_STOP 232ebaca42Sjeremylt!----------------------------------------------------------------------- 242ebaca42Sjeremylt subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 252ebaca42Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 26f1a4e9feSjeremylt! LCOV_EXCL_START 272ebaca42Sjeremylt real*8 ctx 282ebaca42Sjeremylt real*8 u1(1) 292ebaca42Sjeremylt real*8 u2(1) 302ebaca42Sjeremylt real*8 v1(1) 312ebaca42Sjeremylt integer q,ierr 322ebaca42Sjeremylt 332ebaca42Sjeremylt do i=1,q 342ebaca42Sjeremylt v1(i)=u2(i)*u1(i) 352ebaca42Sjeremylt enddo 362ebaca42Sjeremylt 372ebaca42Sjeremylt ierr=0 382ebaca42Sjeremylt end 39f1a4e9feSjeremylt! LCOV_EXCL_STOP 402ebaca42Sjeremylt!----------------------------------------------------------------------- 412ebaca42Sjeremylt program test 422ebaca42Sjeremylt 432ebaca42Sjeremylt include 'ceedf.h' 442ebaca42Sjeremylt 452ebaca42Sjeremylt integer ceed,err,i,j,k 46*a8d32208Sjeremylt integer lmode 47*a8d32208Sjeremylt parameter(lmode=ceed_notranspose) 482ebaca42Sjeremylt integer erestrictxtet,erestrictutet,erestrictxitet,erestrictuitet,& 492ebaca42Sjeremylt& erestrictxhex,erestrictuhex,erestrictxihex,erestrictuihex 502ebaca42Sjeremylt integer bxtet,butet,bxhex,buhex 512ebaca42Sjeremylt integer qf_setuptet,qf_masstet,qf_setuphex,qf_masshex 522ebaca42Sjeremylt integer op_setuptet,op_masstet,op_setuphex,op_masshex,op_setup,op_mass 532ebaca42Sjeremylt integer qdatatet,qdatahex,x 542ebaca42Sjeremylt integer nelemtet,nelemhex,ptet,phex,qtet,qhex,d 552ebaca42Sjeremylt integer row,col,offset 562ebaca42Sjeremylt parameter(nelemtet=6) 572ebaca42Sjeremylt parameter(ptet=6) 582ebaca42Sjeremylt parameter(qtet=4) 592ebaca42Sjeremylt parameter(nelemhex=6) 602ebaca42Sjeremylt parameter(phex=3) 612ebaca42Sjeremylt parameter(qhex=4) 622ebaca42Sjeremylt parameter(d=2) 632ebaca42Sjeremylt integer ndofs,nqptstet,nqptshex,nqpts,nx,ny,nxtet,nytet,nxhex 642ebaca42Sjeremylt parameter(nx=3) 652ebaca42Sjeremylt parameter(ny=3) 662ebaca42Sjeremylt parameter(nxtet=3) 672ebaca42Sjeremylt parameter(nytet=1) 682ebaca42Sjeremylt parameter(nxhex=3) 692ebaca42Sjeremylt parameter(ndofs=(nx*2+1)*(ny*2+1)) 702ebaca42Sjeremylt parameter(nqptstet=nelemtet*qtet) 712ebaca42Sjeremylt parameter(nqptshex=nelemhex*qhex*qhex) 722ebaca42Sjeremylt parameter(nqpts=nqptstet+nqptshex) 732ebaca42Sjeremylt integer indxtet(nelemtet*ptet),indxhex(nelemhex*phex*phex) 742ebaca42Sjeremylt 752ebaca42Sjeremylt real*8 qref(d*qtet) 762ebaca42Sjeremylt real*8 qweight(qtet) 772ebaca42Sjeremylt real*8 interp(ptet*qtet) 782ebaca42Sjeremylt real*8 grad(d*ptet*qtet) 792ebaca42Sjeremylt 802ebaca42Sjeremylt character arg*32 812ebaca42Sjeremylt 82f1a4e9feSjeremylt! LCOV_EXCL_START 832ebaca42Sjeremylt external setup,mass 84f1a4e9feSjeremylt! LCOV_EXCL_STOP 852ebaca42Sjeremylt 862ebaca42Sjeremylt call getarg(1,arg) 872ebaca42Sjeremylt 882ebaca42Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 892ebaca42Sjeremylt 902ebaca42Sjeremylt! DoF Coordinates 912ebaca42Sjeremylt call ceedvectorcreate(ceed,d*ndofs,x,err) 922ebaca42Sjeremylt 932ebaca42Sjeremylt! Qdata Vectors 942ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptstet,qdatatet,err) 952ebaca42Sjeremylt call ceedvectorcreate(ceed,nqptshex,qdatahex,err) 962ebaca42Sjeremylt 972ebaca42Sjeremylt! Tet Elements 982ebaca42Sjeremylt do i=0,2 992ebaca42Sjeremylt col=mod(i,nx) 1002ebaca42Sjeremylt row=i/nx 1012ebaca42Sjeremylt offset=col*2+row*(nx*2+1)*2 1022ebaca42Sjeremylt 1032ebaca42Sjeremylt indxtet(i*2*ptet+1)=2+offset 1042ebaca42Sjeremylt indxtet(i*2*ptet+2)=9+offset 1052ebaca42Sjeremylt indxtet(i*2*ptet+3)=16+offset 1062ebaca42Sjeremylt indxtet(i*2*ptet+4)=1+offset 1072ebaca42Sjeremylt indxtet(i*2*ptet+5)=8+offset 1082ebaca42Sjeremylt indxtet(i*2*ptet+6)=0+offset 1092ebaca42Sjeremylt 1102ebaca42Sjeremylt indxtet(i*2*ptet+7)=14+offset 1112ebaca42Sjeremylt indxtet(i*2*ptet+8)=7+offset 1122ebaca42Sjeremylt indxtet(i*2*ptet+9)=0+offset 1132ebaca42Sjeremylt indxtet(i*2*ptet+10)=15+offset 1142ebaca42Sjeremylt indxtet(i*2*ptet+11)=8+offset 1152ebaca42Sjeremylt indxtet(i*2*ptet+12)=16+offset 1162ebaca42Sjeremylt enddo 1172ebaca42Sjeremylt 1182ebaca42Sjeremylt! -- Restrictions 119*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,d,& 120*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictxtet,err) 121*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,ptet,& 122*a8d32208Sjeremylt & nelemtet*ptet,d,erestrictxitet,err) 1232ebaca42Sjeremylt 124*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemtet,ptet,ndofs,1,& 125*a8d32208Sjeremylt & ceed_mem_host,ceed_use_pointer,indxtet,erestrictutet,err) 126*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemtet,qtet,nqptstet,& 127*a8d32208Sjeremylt & 1,erestrictuitet,err) 1282ebaca42Sjeremylt 1292ebaca42Sjeremylt! -- Bases 1302ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 1312ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,d,ptet,qtet,interp,grad,qref,& 1322ebaca42Sjeremylt & qweight,bxtet,err) 1332ebaca42Sjeremylt call buildmats(qref,qweight,interp,grad) 1342ebaca42Sjeremylt call ceedbasiscreateh1(ceed,ceed_triangle,1,ptet,qtet,interp,grad,qref,& 1352ebaca42Sjeremylt & qweight,butet,err) 1362ebaca42Sjeremylt 1372ebaca42Sjeremylt! -- QFunctions 1382ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 1392ebaca42Sjeremylt &SOURCE_DIR& 140872c4ebbSjeremylt &//'t510-operator.h:setup'//char(0),qf_setuptet,err) 1412ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'_weight',1,ceed_eval_weight,err) 1422ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuptet,'dx',d*d,ceed_eval_grad,err) 1432ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuptet,'rho',1,ceed_eval_none,err) 1442ebaca42Sjeremylt 1452ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 1462ebaca42Sjeremylt &SOURCE_DIR& 147872c4ebbSjeremylt &//'t510-operator.h:mass'//char(0),qf_masstet,err) 1482ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'rho',1,ceed_eval_none,err) 1492ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masstet,'u',1,ceed_eval_interp,err) 1502ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masstet,'v',1,ceed_eval_interp,err) 1512ebaca42Sjeremylt 1522ebaca42Sjeremylt! -- Operators 1532ebaca42Sjeremylt! ---- Setup Tet 1542ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuptet,ceed_qfunction_none,& 1552ebaca42Sjeremylt & ceed_qfunction_none,op_setuptet,err) 1562ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'_weight',erestrictxitet,& 157*a8d32208Sjeremylt & bxtet,ceed_vector_none,err) 1582ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'dx',erestrictxtet,& 159*a8d32208Sjeremylt & bxtet,ceed_vector_active,err) 1602ebaca42Sjeremylt call ceedoperatorsetfield(op_setuptet,'rho',erestrictuitet,& 161*a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 1622ebaca42Sjeremylt! ---- Mass Tet 1632ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masstet,ceed_qfunction_none,& 1642ebaca42Sjeremylt & ceed_qfunction_none,op_masstet,err) 1652ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'rho',erestrictuitet,& 166*a8d32208Sjeremylt & ceed_basis_collocated,qdatatet,err) 1672ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'u',erestrictutet,& 168*a8d32208Sjeremylt & butet,ceed_vector_active,err) 1692ebaca42Sjeremylt call ceedoperatorsetfield(op_masstet,'v',erestrictutet,& 170*a8d32208Sjeremylt & butet,ceed_vector_active,err) 1712ebaca42Sjeremylt 1722ebaca42Sjeremylt! Hex Elements 1732ebaca42Sjeremylt do i=0,nelemhex-1 1742ebaca42Sjeremylt col=mod(i,nx) 1752ebaca42Sjeremylt row=i/nx 1762ebaca42Sjeremylt offset=(nxtet*2+1)*(nytet*2)*(1+row)+col*2 1772ebaca42Sjeremylt do j=0,phex-1 1782ebaca42Sjeremylt do k=0,phex-1 1792ebaca42Sjeremylt indxhex(phex*(phex*i+k)+j+1)=offset+k*(nxhex*2+1)+j 1802ebaca42Sjeremylt enddo 1812ebaca42Sjeremylt enddo 1822ebaca42Sjeremylt enddo 1832ebaca42Sjeremylt 1842ebaca42Sjeremylt! -- Restrictions 185*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,d,& 1862ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictxhex,err) 187*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,phex*phex,& 1882ebaca42Sjeremylt & nelemhex*phex*phex,d,erestrictxihex,err) 1892ebaca42Sjeremylt 190*a8d32208Sjeremylt call ceedelemrestrictioncreate(ceed,lmode,nelemhex,phex*phex,ndofs,1,& 1912ebaca42Sjeremylt & ceed_mem_host,ceed_use_pointer,indxhex,erestrictuhex,err) 192*a8d32208Sjeremylt call ceedelemrestrictioncreateidentity(ceed,lmode,nelemhex,qhex*qhex,& 193*a8d32208Sjeremylt & nqptshex,1,erestrictuihex,err) 1942ebaca42Sjeremylt 1952ebaca42Sjeremylt! -- Bases 1962ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,d,phex,qhex,ceed_gauss,& 1972ebaca42Sjeremylt & bxhex,err) 1982ebaca42Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,d,1,phex,qhex,ceed_gauss,& 1992ebaca42Sjeremylt & buhex,err) 2002ebaca42Sjeremylt 2012ebaca42Sjeremylt! -- QFunctions 2022ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 2032ebaca42Sjeremylt &SOURCE_DIR& 2042ebaca42Sjeremylt &//'t510-operator.h:setup'//char(0),qf_setuphex,err) 2052ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'_weight',1,ceed_eval_weight,err) 2062ebaca42Sjeremylt call ceedqfunctionaddinput(qf_setuphex,'dx',d*d,ceed_eval_grad,err) 2072ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_setuphex,'rho',1,ceed_eval_none,err) 2082ebaca42Sjeremylt 2092ebaca42Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 2102ebaca42Sjeremylt &SOURCE_DIR& 2112ebaca42Sjeremylt &//'t510-operator.h:mass'//char(0),qf_masshex,err) 2122ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'rho',1,ceed_eval_none,err) 2132ebaca42Sjeremylt call ceedqfunctionaddinput(qf_masshex,'u',1,ceed_eval_interp,err) 2142ebaca42Sjeremylt call ceedqfunctionaddoutput(qf_masshex,'v',1,ceed_eval_interp,err) 2152ebaca42Sjeremylt 2162ebaca42Sjeremylt! -- Operators 2172ebaca42Sjeremylt! ---- Setup Hex 2182ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_setuphex,ceed_qfunction_none,& 2192ebaca42Sjeremylt & ceed_qfunction_none,op_setuphex,err) 2202ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'_weight',erestrictxihex,& 221*a8d32208Sjeremylt & bxhex,ceed_vector_none,err) 2222ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'dx',erestrictxhex,& 223*a8d32208Sjeremylt & bxhex,ceed_vector_active,err) 2242ebaca42Sjeremylt call ceedoperatorsetfield(op_setuphex,'rho',erestrictuihex,& 225*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 2262ebaca42Sjeremylt! ---- Mass Hex 2272ebaca42Sjeremylt call ceedoperatorcreate(ceed,qf_masshex,ceed_qfunction_none,& 2282ebaca42Sjeremylt & ceed_qfunction_none,op_masshex,err) 2292ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'rho',erestrictuihex,& 230*a8d32208Sjeremylt & ceed_basis_collocated,qdatahex,err) 2312ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'u',erestrictuhex,& 232*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 2332ebaca42Sjeremylt call ceedoperatorsetfield(op_masshex,'v',erestrictuhex,& 234*a8d32208Sjeremylt & buhex,ceed_vector_active,err) 2352ebaca42Sjeremylt 2362ebaca42Sjeremylt! Composite Operators 2372ebaca42Sjeremylt call ceedcompositeoperatorcreate(ceed,op_setup,err) 2382ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuptet,err) 2392ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_setup,op_setuphex,err) 2402ebaca42Sjeremylt 2412ebaca42Sjeremylt call ceedcompositeoperatorcreate(ceed,op_mass,err) 2422ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masstet,err) 2432ebaca42Sjeremylt call ceedcompositeoperatoraddsub(op_mass,op_masshex,err) 2442ebaca42Sjeremylt 2452ebaca42Sjeremylt! View 2462ebaca42Sjeremylt call ceedoperatorview(op_setup,err) 2472ebaca42Sjeremylt call ceedoperatorview(op_mass,err) 2482ebaca42Sjeremylt 2492ebaca42Sjeremylt! Cleanup 2502ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuptet,err) 2512ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masstet,err) 2522ebaca42Sjeremylt call ceedoperatordestroy(op_setuptet,err) 2532ebaca42Sjeremylt call ceedoperatordestroy(op_masstet,err) 2542ebaca42Sjeremylt call ceedqfunctiondestroy(qf_setuphex,err) 2552ebaca42Sjeremylt call ceedqfunctiondestroy(qf_masshex,err) 2562ebaca42Sjeremylt call ceedoperatordestroy(op_setuphex,err) 2572ebaca42Sjeremylt call ceedoperatordestroy(op_masshex,err) 2582ebaca42Sjeremylt call ceedoperatordestroy(op_setup,err) 2592ebaca42Sjeremylt call ceedoperatordestroy(op_mass,err) 2602ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictutet,err) 2612ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxtet,err) 2622ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuitet,err) 2632ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxitet,err) 2642ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuhex,err) 2652ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxhex,err) 2662ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictuihex,err) 2672ebaca42Sjeremylt call ceedelemrestrictiondestroy(erestrictxihex,err) 2682ebaca42Sjeremylt call ceedbasisdestroy(butet,err) 2692ebaca42Sjeremylt call ceedbasisdestroy(bxtet,err) 2702ebaca42Sjeremylt call ceedbasisdestroy(buhex,err) 2712ebaca42Sjeremylt call ceedbasisdestroy(bxhex,err) 2722ebaca42Sjeremylt call ceedvectordestroy(x,err) 2732ebaca42Sjeremylt call ceedvectordestroy(qdatatet,err) 2742ebaca42Sjeremylt call ceedvectordestroy(qdatahex,err) 2752ebaca42Sjeremylt call ceeddestroy(ceed,err) 2762ebaca42Sjeremylt end 2772ebaca42Sjeremylt!----------------------------------------------------------------------- 278