diff --git a/src/ppm_comp_pp_kernels.inc b/src/ppm_comp_pp_kernels.inc new file mode 100644 index 0000000000000000000000000000000000000000..554f5ae5ffd3a6ceedbcc1a4d2dcebe656a8344d --- /dev/null +++ b/src/ppm_comp_pp_kernels.inc @@ -0,0 +1,188 @@ + !------------------------------------------------------------------------- + ! Include file for different PP kernels. This is included in all + ! the pse_comp_pp* routines wherever kernel evaluations are needed. + ! Only change this file to add/edit kernel functions. + ! + ! INPUT: dij is the squared distance between particles i and j + ! All kernel parameters need to be passed in kpar(:). + ! dx, dy and dz are the components of the inter particle vector. + ! OUTPUT: eta is the kernel value for the given distance + ! + ! Remark: Should SXF90 stop to unfold the loops (swap IF and DO) + ! because the number of kernels grows too big, we will simply make + ! several such .inc files and make several versions of the comp_pp + ! routines with cpp if to choose the proper include file. + !------------------------------------------------------------------------- + ! $Log: ppm_comp_pp_kernels.inc,v $ + ! Revision 1.1.1.1 2007/07/13 10:18:54 ivos + ! CBL version of the PPM library + ! + ! Revision 1.4 2004/11/11 15:27:09 ivos + ! Optimized PSE kernels for speed. + ! + ! Revision 1.3 2004/10/13 16:42:11 davidch + ! added support for 3d sph kernels + ! + ! Revision 1.2 2004/07/29 15:56:48 hiebers + ! added kernel_sph2d_p2 and kernel_dx_sph2d_p2 + ! + ! Revision 1.1 2004/07/23 12:57:31 ivos + ! Initial implementation. Not tested. + ! + !------------------------------------------------------------------------- + ! Parallel Particle Mesh Library (PPM) + ! ETH Zurich + ! CH-8092 Zurich, Switzerland + !------------------------------------------------------------------------- + +#if __KERNEL == __INTERNAL + IF (kernel .EQ. ppm_param_kernel_fast3d) THEN + !--------------------------------------------------------------------- + ! 2nd order sph kernel 3d + ! kpar(1) cutoff^2 + ! kpar(2) 1/cutoff^9 + ! eta(delta^2) = 315/64/Pi/cutoff^9*(cutoff^2-r^2)^3 + !--------------------------------------------------------------------- + factor = kpar(1) - dij + eta = 1.5666814710608_MK * kpar(2) + eta = eta * factor * factor * factor + ELSEIF (kernel .EQ. ppm_param_kernel_fast3d_dx) THEN + !--------------------------------------------------------------------- + ! 2nd order sph kernel 3d, dx + ! kpar(1) cutoff^2 + ! kpar(2) 1/cutoff^9 + ! eta(delta^2) = -945/32/Pi/cutoff^9*(cutoff^2-r^2)^2*x + !--------------------------------------------------------------------- + factor = kpar(1) - dij + eta = -9.400088826365_MK * kpar(2) * dx + eta = eta * factor * factor + ELSEIF (kernel .EQ. ppm_param_kernel_fast3d_dy) THEN + !--------------------------------------------------------------------- + ! 2nd order sph kernel 3d, dy + ! kpar(1) cutoff^2 + ! kpar(2) 1/cutoff^9 + ! eta(delta^2) = -945/32/Pi/cutoff^9*(cutoff^2-r^2)^2*y + !--------------------------------------------------------------------- + factor = kpar(1) - dij + eta = -9.400088826365_MK * kpar(2) * dy + eta = eta * factor * factor + ELSEIF (kernel .EQ. ppm_param_kernel_fast3d_dz) THEN + !--------------------------------------------------------------------- + ! 2nd order sph kernel 3d, dz + ! kpar(1) cutoff^2 + ! kpar(2) 1/cutoff^9 + ! eta(delta^2) = -945/32/Pi/cutoff^9*(cutoff^2-r^2)^2*z + !--------------------------------------------------------------------- + factor = kpar(1) - dij + eta = -9.400088826365_MK * kpar(2) * dz + eta = eta * factor * factor + ELSEIF (kernel .EQ. ppm_param_kernel_fast3d_lap) THEN + !--------------------------------------------------------------------- + ! 2nd order sph kernel 3d, laplacian + ! kpar(1) cutoff^2 + ! kpar(2) 1/cutoff^9 + ! eta(delta^2) = -945/32/Pi/cutoff^9*(cutoff^2-r^2)(3*cutoff^2-7*r^2) + !--------------------------------------------------------------------- + factor = kpar(1) - dij + factor2 = 3.0_MK * kpar(1) - 7.0_MK * dij + eta = -9.400088826365_MK * kpar(2) + eta = eta * factor * factor2 + ELSEIF (kernel .EQ. ppm_param_kernel_laplace2d_p2) THEN + !--------------------------------------------------------------------- + ! 2nd order polynomial kernel 2D. + ! kpar(1) eps2inv (1/eps**2) + ! kpar(2) correction*15.0*dh^2*eps^(-4)/pi^2 + !--------------------------------------------------------------------- + dij = dij*kpar(1) + dij2 = dij*dij + dij4 = dij2*dij2 + dij5 = dij4*dij + eta = dij5 + 1.0_MK + eta = kpar(2)/eta + ELSEIF (kernel .EQ. ppm_param_kernel_laplace3d_p2) THEN + !--------------------------------------------------------------------- + ! 2nd order polynomial kernel 3D. + ! kpar(1) eps2inv (1/eps**2) + ! kpar(2) correction*15.0*dh^3*eps^(-5)/pi^2 + !--------------------------------------------------------------------- + dij = dij*kpar(1) + dij2 = dij*dij + dij4 = dij2*dij2 + dij5 = dij4*dij + eta = dij5 + 1.0_MK + eta = kpar(2)/eta + ELSEIF (kernel .EQ. ppm_param_kernel_sph2d_p2 ) THEN + !--------------------------------------------------------------------- + ! 2nd order quartic spline kernel M5 2D. + ! kpar(1) eps (kernel width) + ! kpar(2) eps2 (eps**2) + ! kpar(3) eps2inv (1/eps**2) + ! kpar(4) eps5inv (1/eps**4) + ! kpar(5) dh3 (particle volume) + ! kpar(6) piinv (1/PI, the math constant) + ! kpar(7) kappa (discretisation correction factor) + !--------------------------------------------------------------------- + factor = kpar(3)*kpar(6) + dij2 = dij*kpar(3) + dij = sqrt( dij2 ) + + IF (dij.LT.2.5_MK) THEN + IF (dij.LT.1.5_MK) THEN + IF (dij.LT.0.5_MK) THEN + eta = 0.3_MK*dij2*dij2 - 0.75_MK*dij2 + 0.71875_MK + ELSE + eta = -0.2_MK*dij2*dij2 + dij2*dij - 1.5_MK*dij2 & + & + 0.25_MK*dij+0.6875_MK + ENDIF + ELSE + dij4 = 2.5_MK - dij + eta = 0.05_MK*dij4*dij4*dij4*dij4 + ENDIF + ELSE + eta = 0.0_MK + ENDIF + eta = eta*factor*kpar(7) + ELSEIF (kernel .EQ. ppm_param_kernel_dx_sph2d_p2 ) THEN + !--------------------------------------------------------------------- + ! 2nd order quartic spline kernel M5 2D for first Derivative d/dx. + ! kpar(1) eps (kernel width) + ! kpar(2) epsinv (1/eps) + ! kpar(3) eps2inv (1/eps**2) + ! kpar(4) eps5inv (1/eps**4) + ! kpar(5) dh3 (particle volume) + ! kpar(6) piinv (1/PI, the math constant) + ! kpar(7) kappa (discretisation correction factor) + !--------------------------------------------------------------------- + factor = kpar(3)*kpar(6) + dij2 = dij*kpar(3) + dij = sqrt( dij2 ) + + IF ( dij.LT.2.5_MK .AND. dij>0.0_MK ) THEN + IF (dij.LT.1.5_MK) THEN + IF (dij.LT.0.5_MK) THEN + eta = 1.2_MK*dij2*dij - 1.5_MK*dij + ELSE + eta = -0.8_MK*dij2*dij + 3_MK*dij2 - 3_MK*dij + 0.25_MK + ENDIF + ELSE + dij4 = 2.5_MK - dij + eta = -0.2_MK*dij4*dij4*dij4 + ENDIF + ELSE + eta = 0.0_MK + ENDIF + eta = eta*factor*kpar(7)*kpar(2)/dij*dx +! eta = eta*factor*kpar(7)*kpar(2)/dij + ELSE + !--------------------------------------------------------------------- + ! This ELSE is needed to avoid funny action when an invalid + ! kernel is specified (and to make SXF90 unfold the loops). + !--------------------------------------------------------------------- + eta = 0.0_MK + ENDIF +#elif __KERNEL == __USER_FUNCTION + eta = kernel(dij,kpar) +#elif __KERNEL == __LOOKUP_TABLE + idx = INT(dij*kpar) + eta = kernel(idx) +#endif diff --git a/src/ppm_module_user_numerics.f b/src/ppm_module_user_numerics.f index 56a0d0e5ff626d48c0c418540e6428b49710aae6..e382ba1723b9f89862665bb4c147567ff8d05d7f 100644 --- a/src/ppm_module_user_numerics.f +++ b/src/ppm_module_user_numerics.f @@ -25,6 +25,7 @@ !---------------------------------------------------------------------- ! PPM numerics routines !---------------------------------------------------------------------- + USE ppm_module_comp_part USE ppm_module_bem USE ppm_module_fieldsolver USE ppm_module_ode