1*5b3ccac8Sjeremylt!----------------------------------------------------------------------- 2*5b3ccac8Sjeremylt subroutine setup(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 3*5b3ccac8Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 4*5b3ccac8Sjeremylt real*8 ctx 5*5b3ccac8Sjeremylt real*8 u1(1) 6*5b3ccac8Sjeremylt real*8 u2(1) 7*5b3ccac8Sjeremylt real*8 v1(1) 8*5b3ccac8Sjeremylt integer q,ierr 9*5b3ccac8Sjeremylt 10*5b3ccac8Sjeremylt do i=1,q 11*5b3ccac8Sjeremylt v1(i)=u1(i)*u2(i) 12*5b3ccac8Sjeremylt enddo 13*5b3ccac8Sjeremylt 14*5b3ccac8Sjeremylt ierr=0 15*5b3ccac8Sjeremylt end 16*5b3ccac8Sjeremylt!----------------------------------------------------------------------- 17*5b3ccac8Sjeremylt subroutine mass(ctx,q,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,u13,u14,& 18*5b3ccac8Sjeremylt& u15,u16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,v16,ierr) 19*5b3ccac8Sjeremylt real*8 ctx 20*5b3ccac8Sjeremylt real*8 u1(1) 21*5b3ccac8Sjeremylt real*8 u2(1) 22*5b3ccac8Sjeremylt real*8 v1(1) 23*5b3ccac8Sjeremylt integer q,ierr 24*5b3ccac8Sjeremylt 25*5b3ccac8Sjeremylt do i=1,q 26*5b3ccac8Sjeremylt v1(i)=u2(i)*u1(i) 27*5b3ccac8Sjeremylt v1(q+i)=u2(q+i)*u1(i) 28*5b3ccac8Sjeremylt enddo 29*5b3ccac8Sjeremylt 30*5b3ccac8Sjeremylt ierr=0 31*5b3ccac8Sjeremylt end 32*5b3ccac8Sjeremylt!----------------------------------------------------------------------- 33*5b3ccac8Sjeremylt program test 34*5b3ccac8Sjeremylt 35*5b3ccac8Sjeremylt include 'ceedf.h' 36*5b3ccac8Sjeremylt 37*5b3ccac8Sjeremylt integer ceed,err,i,j 38*5b3ccac8Sjeremylt integer imode 39*5b3ccac8Sjeremylt parameter(imode=ceed_noninterlaced) 40*5b3ccac8Sjeremylt integer imodeu 41*5b3ccac8Sjeremylt parameter(imodeu=ceed_interlaced) 42*5b3ccac8Sjeremylt integer stridesu_small(3),stridesu_large(3) 43*5b3ccac8Sjeremylt integer erestrictx,erestrictu 44*5b3ccac8Sjeremylt integer erestrictui_small,erestrictui_large 45*5b3ccac8Sjeremylt integer bx_small,bu_small,bx_large,bu_large 46*5b3ccac8Sjeremylt integer qf_setup,qf_mass 47*5b3ccac8Sjeremylt integer op_setup_small,op_mass_small,op_setup_large,op_mass_large 48*5b3ccac8Sjeremylt integer qdata_small,qdata_large,x,u,v 49*5b3ccac8Sjeremylt integer nelem,p,q,scale 50*5b3ccac8Sjeremylt parameter(nelem=15) 51*5b3ccac8Sjeremylt parameter(p=5) 52*5b3ccac8Sjeremylt parameter(q=8) 53*5b3ccac8Sjeremylt parameter(scale=3) 54*5b3ccac8Sjeremylt integer nx,nu 55*5b3ccac8Sjeremylt parameter(nx=nelem+1) 56*5b3ccac8Sjeremylt parameter(nu=nelem*(p-1)+1) 57*5b3ccac8Sjeremylt integer indx(nelem*2) 58*5b3ccac8Sjeremylt integer indu(nelem*p) 59*5b3ccac8Sjeremylt real*8 arrx(nx) 60*5b3ccac8Sjeremylt integer*8 voffset,xoffset 61*5b3ccac8Sjeremylt 62*5b3ccac8Sjeremylt real*8 hu(nu*2),hv(nu*2) 63*5b3ccac8Sjeremylt real*8 total1,total2 64*5b3ccac8Sjeremylt 65*5b3ccac8Sjeremylt character arg*32 66*5b3ccac8Sjeremylt 67*5b3ccac8Sjeremylt external setup,mass 68*5b3ccac8Sjeremylt 69*5b3ccac8Sjeremylt call getarg(1,arg) 70*5b3ccac8Sjeremylt call ceedinit(trim(arg)//char(0),ceed,err) 71*5b3ccac8Sjeremylt 72*5b3ccac8Sjeremylt do i=0,nx-1 73*5b3ccac8Sjeremylt arrx(i+1)=i/(nx-1.d0) 74*5b3ccac8Sjeremylt enddo 75*5b3ccac8Sjeremylt do i=0,nelem-1 76*5b3ccac8Sjeremylt indx(2*i+1)=i 77*5b3ccac8Sjeremylt indx(2*i+2)=i+1 78*5b3ccac8Sjeremylt enddo 79*5b3ccac8Sjeremylt 80*5b3ccac8Sjeremylt call ceedelemrestrictioncreate(ceed,imode,nelem,2,nx,1,ceed_mem_host,& 81*5b3ccac8Sjeremylt & ceed_use_pointer,indx,erestrictx,err) 82*5b3ccac8Sjeremylt 83*5b3ccac8Sjeremylt do i=0,nelem-1 84*5b3ccac8Sjeremylt do j=0,p-1 85*5b3ccac8Sjeremylt indu(p*i+j+1)=i*(p-1)+j 86*5b3ccac8Sjeremylt enddo 87*5b3ccac8Sjeremylt enddo 88*5b3ccac8Sjeremylt 89*5b3ccac8Sjeremylt call ceedelemrestrictioncreate(ceed,imodeu,nelem,p,nu,2,ceed_mem_host,& 90*5b3ccac8Sjeremylt & ceed_use_pointer,indu,erestrictu,err) 91*5b3ccac8Sjeremylt stridesu_small=[1,q,q] 92*5b3ccac8Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,q,q*nelem,1,& 93*5b3ccac8Sjeremylt & stridesu_small,erestrictui_small,err) 94*5b3ccac8Sjeremylt stridesu_large=[1,q*scale,q*scale] 95*5b3ccac8Sjeremylt call ceedelemrestrictioncreatestrided(ceed,nelem,q*scale,q*nelem*scale,& 96*5b3ccac8Sjeremylt & 1,stridesu_large,erestrictui_large,err) 97*5b3ccac8Sjeremylt 98*5b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q,ceed_gauss,bx_small,err) 99*5b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q,ceed_gauss,bu_small,err) 100*5b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,1,2,q*scale,& 101*5b3ccac8Sjeremylt & ceed_gauss,bx_large,err) 102*5b3ccac8Sjeremylt call ceedbasiscreatetensorh1lagrange(ceed,1,2,p,q*scale,& 103*5b3ccac8Sjeremylt & ceed_gauss,bu_large,err) 104*5b3ccac8Sjeremylt 105*5b3ccac8Sjeremylt! Common QFunctions 106*5b3ccac8Sjeremylt 107*5b3ccac8Sjeremylt call ceedqfunctioncreateinterior(ceed,1,setup,& 108*5b3ccac8Sjeremylt &SOURCE_DIR& 109*5b3ccac8Sjeremylt &//'t502-operator.h:setup'//char(0),qf_setup,err) 110*5b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_setup,'_weight',1,ceed_eval_weight,err) 111*5b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_setup,'x',1,ceed_eval_grad,err) 112*5b3ccac8Sjeremylt call ceedqfunctionaddoutput(qf_setup,'rho',1,ceed_eval_none,err) 113*5b3ccac8Sjeremylt 114*5b3ccac8Sjeremylt call ceedqfunctioncreateinterior(ceed,1,mass,& 115*5b3ccac8Sjeremylt &SOURCE_DIR& 116*5b3ccac8Sjeremylt &//'t502-operator.h:mass'//char(0),qf_mass,err) 117*5b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_mass,'rho',1,ceed_eval_none,err) 118*5b3ccac8Sjeremylt call ceedqfunctionaddinput(qf_mass,'u',2,ceed_eval_interp,err) 119*5b3ccac8Sjeremylt call ceedqfunctionaddoutput(qf_mass,'v',2,ceed_eval_interp,err) 120*5b3ccac8Sjeremylt 121*5b3ccac8Sjeremylt call ceedvectorcreate(ceed,nx,x,err) 122*5b3ccac8Sjeremylt xoffset=0 123*5b3ccac8Sjeremylt call ceedvectorsetarray(x,ceed_mem_host,ceed_use_pointer,arrx,xoffset,err) 124*5b3ccac8Sjeremylt 125*5b3ccac8Sjeremylt! Small operator 126*5b3ccac8Sjeremylt 127*5b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,& 128*5b3ccac8Sjeremylt & ceed_qfunction_none,op_setup_small,err) 129*5b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,& 130*5b3ccac8Sjeremylt & ceed_qfunction_none,op_mass_small,err) 131*5b3ccac8Sjeremylt 132*5b3ccac8Sjeremylt call ceedvectorcreate(ceed,nelem*q,qdata_small,err) 133*5b3ccac8Sjeremylt 134*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'_weight',& 135*5b3ccac8Sjeremylt & ceed_elemrestriction_none,bx_small,ceed_vector_none,err) 136*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'x',erestrictx,& 137*5b3ccac8Sjeremylt & bx_small,ceed_vector_active,err) 138*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_small,'rho',erestrictui_small,& 139*5b3ccac8Sjeremylt & ceed_basis_collocated,ceed_vector_active,err) 140*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'rho',erestrictui_small,& 141*5b3ccac8Sjeremylt & ceed_basis_collocated,qdata_small,err) 142*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'u',erestrictu,& 143*5b3ccac8Sjeremylt & bu_small,ceed_vector_active,err) 144*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_small,'v',erestrictu,& 145*5b3ccac8Sjeremylt & bu_small,ceed_vector_active,err) 146*5b3ccac8Sjeremylt 147*5b3ccac8Sjeremylt! Large operator 148*5b3ccac8Sjeremylt 149*5b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_setup,ceed_qfunction_none,& 150*5b3ccac8Sjeremylt & ceed_qfunction_none,op_setup_large,err) 151*5b3ccac8Sjeremylt call ceedoperatorcreate(ceed,qf_mass,ceed_qfunction_none,& 152*5b3ccac8Sjeremylt & ceed_qfunction_none,op_mass_large,err) 153*5b3ccac8Sjeremylt 154*5b3ccac8Sjeremylt call ceedvectorcreate(ceed,nelem*q*scale,qdata_large,err) 155*5b3ccac8Sjeremylt 156*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'_weight',& 157*5b3ccac8Sjeremylt & ceed_elemrestriction_none,bx_large,ceed_vector_none,err) 158*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'x',erestrictx,& 159*5b3ccac8Sjeremylt & bx_large,ceed_vector_active,err) 160*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_setup_large,'rho',erestrictui_large,& 161*5b3ccac8Sjeremylt & ceed_basis_collocated,ceed_vector_active,err) 162*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'rho',erestrictui_large,& 163*5b3ccac8Sjeremylt & ceed_basis_collocated,qdata_large,err) 164*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'u',erestrictu,& 165*5b3ccac8Sjeremylt & bu_large,ceed_vector_active,err) 166*5b3ccac8Sjeremylt call ceedoperatorsetfield(op_mass_large,'v',erestrictu,& 167*5b3ccac8Sjeremylt & bu_large,ceed_vector_active,err) 168*5b3ccac8Sjeremylt 169*5b3ccac8Sjeremylt! Setup U, V 170*5b3ccac8Sjeremylt 171*5b3ccac8Sjeremylt call ceedvectorcreate(ceed,2*nu,u,err) 172*5b3ccac8Sjeremylt call ceedvectorgetarray(u,ceed_mem_host,hu,voffset,err) 173*5b3ccac8Sjeremylt do i=1,nu 174*5b3ccac8Sjeremylt hu(voffset+2*i-1)=1. 175*5b3ccac8Sjeremylt hu(voffset+2*i)=2. 176*5b3ccac8Sjeremylt enddo 177*5b3ccac8Sjeremylt call ceedvectorrestorearray(u,hu,voffset,err) 178*5b3ccac8Sjeremylt call ceedvectorcreate(ceed,2*nu,v,err) 179*5b3ccac8Sjeremylt 180*5b3ccac8Sjeremylt! Small apply 181*5b3ccac8Sjeremylt 182*5b3ccac8Sjeremylt call ceedoperatorapply(op_setup_small,x,qdata_small,& 183*5b3ccac8Sjeremylt & ceed_request_immediate,err) 184*5b3ccac8Sjeremylt call ceedoperatorapply(op_mass_small,u,v,ceed_request_immediate,err) 185*5b3ccac8Sjeremylt 186*5b3ccac8Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 187*5b3ccac8Sjeremylt total1=0. 188*5b3ccac8Sjeremylt total2=0. 189*5b3ccac8Sjeremylt do i=1,nu 190*5b3ccac8Sjeremylt total1=total1+hv(voffset+2*i-1) 191*5b3ccac8Sjeremylt total2=total2+hv(voffset+2*i) 192*5b3ccac8Sjeremylt enddo 193*5b3ccac8Sjeremylt if (abs(total1-1.)>1.0d-10) then 194*5b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total1,' != True Area: 1.0' 195*5b3ccac8Sjeremylt endif 196*5b3ccac8Sjeremylt if (abs(total2-2.)>1.0d-10) then 197*5b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total2,' != True Area: 2.0' 198*5b3ccac8Sjeremylt endif 199*5b3ccac8Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 200*5b3ccac8Sjeremylt 201*5b3ccac8Sjeremylt! Large apply 202*5b3ccac8Sjeremylt 203*5b3ccac8Sjeremylt call ceedoperatorapply(op_setup_large,x,qdata_large,& 204*5b3ccac8Sjeremylt & ceed_request_immediate,err) 205*5b3ccac8Sjeremylt call ceedoperatorapply(op_mass_large,u,v,ceed_request_immediate,err) 206*5b3ccac8Sjeremylt 207*5b3ccac8Sjeremylt call ceedvectorgetarrayread(v,ceed_mem_host,hv,voffset,err) 208*5b3ccac8Sjeremylt total1=0. 209*5b3ccac8Sjeremylt total2=0. 210*5b3ccac8Sjeremylt do i=1,nu 211*5b3ccac8Sjeremylt total1=total1+hv(voffset+2*i-1) 212*5b3ccac8Sjeremylt total2=total2+hv(voffset+2*i) 213*5b3ccac8Sjeremylt enddo 214*5b3ccac8Sjeremylt if (abs(total1-1.)>1.0d-10) then 215*5b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total1,' != True Area: 1.0' 216*5b3ccac8Sjeremylt endif 217*5b3ccac8Sjeremylt if (abs(total2-2.)>1.0d-10) then 218*5b3ccac8Sjeremylt write(*,*) 'Computed Area: ',total2,' != True Area: 2.0' 219*5b3ccac8Sjeremylt endif 220*5b3ccac8Sjeremylt call ceedvectorrestorearrayread(v,hv,voffset,err) 221*5b3ccac8Sjeremylt 222*5b3ccac8Sjeremylt call ceedvectordestroy(qdata_small,err) 223*5b3ccac8Sjeremylt call ceedvectordestroy(qdata_large,err) 224*5b3ccac8Sjeremylt call ceedvectordestroy(x,err) 225*5b3ccac8Sjeremylt call ceedvectordestroy(u,err) 226*5b3ccac8Sjeremylt call ceedvectordestroy(v,err) 227*5b3ccac8Sjeremylt call ceedoperatordestroy(op_mass_small,err) 228*5b3ccac8Sjeremylt call ceedoperatordestroy(op_setup_small,err) 229*5b3ccac8Sjeremylt call ceedoperatordestroy(op_mass_large,err) 230*5b3ccac8Sjeremylt call ceedoperatordestroy(op_setup_large,err) 231*5b3ccac8Sjeremylt call ceedqfunctiondestroy(qf_mass,err) 232*5b3ccac8Sjeremylt call ceedqfunctiondestroy(qf_setup,err) 233*5b3ccac8Sjeremylt call ceedbasisdestroy(bu_small,err) 234*5b3ccac8Sjeremylt call ceedbasisdestroy(bx_small,err) 235*5b3ccac8Sjeremylt call ceedbasisdestroy(bu_large,err) 236*5b3ccac8Sjeremylt call ceedbasisdestroy(bx_large,err) 237*5b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictu,err) 238*5b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictx,err) 239*5b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictui_small,err) 240*5b3ccac8Sjeremylt call ceedelemrestrictiondestroy(erestrictui_large,err) 241*5b3ccac8Sjeremylt call ceeddestroy(ceed,err) 242*5b3ccac8Sjeremylt end 243*5b3ccac8Sjeremylt!----------------------------------------------------------------------- 244*5b3ccac8Sjeremylt 245