diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e518a24 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,55 @@ +# Specify minimum requirements +cmake_minimum_required( VERSION 3.5.2 ) + +# display command line +set(CMAKE_VERBOSE_MAKEFILE ON) + +# Collision Solver + +# Add project and description +project(cosolver Fortran ) + +# where to find the src code +set(PROJECT_SRC_DIR ${PROJECT_SOURCE_DIR}/src) +MESSAGE ("source path: ${PROJECT_SOURCE_DIR}") +MESSAGE ("source path to src dir: ${PROJECT_SRC_DIR}") + +# where to output the *.mod file +set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_SOURCE_DIR}/mod) + +# Add external libraries (futils, HDF5) + + +# Futils +set(futils_dir /home/bjfrei/local/spcpc/intel) +set(futils_INCLUDE_dir ${futils_dir}/include/O) +set(futils_LIB_dir ${futils_dir}/lib/O) + +# HDF5 +set(HDF5_LIB_dir /usr/local/hdf5-1.8.18-intel17.0/lib) + +#FMlib +set(FMlib_INCLUDE_dir ${PROJECT_SOURCE_DIR}/FM/mod) +set(FMlib_LIB_dir ${PROJECT_SOURCE_DIR}/FM/lib) + +# include external libraries +set(extern_INCLUDE ${futils_INCLUDE_dir} ${FMlib_INCLUDE_dir}) +set(extern_LIB ${futils_LIB_dir} ${HDF5_LIB_dir} ${FMlib_LIB_dir}) + +include_directories(${extern_INCLUDE}) +link_directories (${extern_LIB}) + +# where to output the executable +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) + +# Define executable +add_executable(${PROJECT_NAME} ${PROJECT_SRC_DIR}/main.f90) + +# link src to exectubale +add_subdirectory(src) + +# Link external libraries to executable +target_link_libraries(${PROJECT_NAME} src futils fm hdf5 hdf5_fortran) + +# compilation flags +set( CMAKE_Fortran_FLAGS_RELEASE "-c -XHost -O3" ) diff --git a/FM/Makefile b/FM/Makefile index 76a0207..31e0ad5 100644 --- a/FM/Makefile +++ b/FM/Makefile @@ -1,60 +1,54 @@ -include local/dirs.inc -#include local/make.inc - -############################################################################################################################################################### - +#Local code, binaries, pputils library +PREFIX = $(HOME)/Documents/cosolver/FM +SRCDIR = $(PREFIX)/src +BINDIR = $(PREFIX)/bin +OBJDIR = $(PREFIX)/obj +LIBDIR = $(PREFIX)/lib +MODDIR = $(PREFIX)/mod F90 = mpif90 EXECTEST = test.exe FOBJ = $(OBJDIR)/fm.o $(OBJDIR)/fmsave.o $(OBJDIR)/fmzm90.o EXTMOD = -module $(MODDIR) +#EXTMOD = -J$(MODDIR) FTEST = $(SRCDIR)/$(EXECTEST) install: dirs lib -############################################################################################################################################################### dirs: mkdir -p $(BINDIR) mkdir -p $(OBJDIR) mkdir -p $(MODDIR) mkdir -p $(LIBDIR) -############################################################################################################################################################### lib: libfm.a -############################################################################################################################################################### - libfm.a: $(FOBJ) ar r $@ $? mv $@ $(LIBDIR) -############################################################################################################################################################### $(OBJDIR)/fm.o: $(OBJDIR)/fmsave.o $(SRCDIR)/fm.f90 $(F90) -c $(EXTMOD) $(SRCDIR)/fm.f90 -o $@ $(OBJDIR)/fmsave.o: $(SRCDIR)/fmsave.f90 $(F90) -c $(EXTMOD) $(SRCDIR)/fmsave.f90 -o $@ $(OBJDIR)/fmzm90.o: $(SRCDIR)/fmzm90.f90 $(OBJDIR)/fmsave.o $(OBJDIR)/fm.o $(F90) -c $(EXTMOD) $(SRCDIR)/fmzm90.f90 -o $@ -############################################################################################################################################################### - clean: cleanobj cleanmod cleanlib cleanobj: @rm -f $(OBJDIR)/*o cleanmod: @rm -f $(MODDIR)/*mod @rm -f cleanlib: @rm -f $(LIBDIR)/*.a -############################################################################################################################################################### - diff --git a/FM/local/dirs.inc b/FM/local/dirs.inc deleted file mode 100644 index 9636e44..0000000 --- a/FM/local/dirs.inc +++ /dev/null @@ -1,8 +0,0 @@ -#Local code, binaries, pputils library -PREFIX = $(HOME)/Documents/cosolver/FM -SRCDIR = $(PREFIX)/src -BINDIR = $(PREFIX)/bin -OBJDIR = $(PREFIX)/obj -LIBDIR = $(PREFIX)/lib -MODDIR = $(PREFIX)/mod - diff --git a/gkcoulomb_suite/CurlyNpjmn/CMakeLists.txt b/gkcoulomb_suite/CurlyNpjmn/CMakeLists.txt new file mode 100644 index 0000000..a2dbe58 --- /dev/null +++ b/gkcoulomb_suite/CurlyNpjmn/CMakeLists.txt @@ -0,0 +1,38 @@ +# Specify minimum requirements +cmake_minimum_required( VERSION 3.5.2 ) + +# display command line +set(CMAKE_VERBOSE_MAKEFILE ON) + +# Add project and description +project(npjmn Fortran ) + +# where to find the src code +set(PROJECT_SRC_DIR ${PROJECT_SOURCE_DIR}/src) +MESSAGE ("source path: ${PROJECT_SOURCE_DIR}") +MESSAGE ("source path to src dir: ${PROJECT_SRC_DIR}") + +# where to output the *.mod file +set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_SOURCE_DIR}/mod) + +#FMlib +set(extern_INCLUDE ${PROJECT_SOURCE_DIR}/../../FM/mod ) +set(extern_LIB ${PROJECT_SOURCE_DIR}/../../FM/lib) + +include_directories(${extern_INCLUDE}) +link_directories (${extern_LIB}) + +# where to output the executable +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) + +# Define executable +add_executable(${PROJECT_NAME} ${PROJECT_SRC_DIR}/main.f90) + +# link src to exectubale +add_subdirectory(src) + +# Link external libraries to executable +target_link_libraries(${PROJECT_NAME} src fm ) + +# compilation flags +set( CMAKE_Fortran_FLAGS_RELEASE "-c -XHost -O3" ) diff --git a/gkcoulomb_suite/CurlyNpjmn/Makefile b/gkcoulomb_suite/CurlyNpjmn/Makefile index e46f717..cf4f5d6 100644 --- a/gkcoulomb_suite/CurlyNpjmn/Makefile +++ b/gkcoulomb_suite/CurlyNpjmn/Makefile @@ -1,95 +1,97 @@ include local/dirs.inc include local/make.inc EXEC = $(BINDIR)/main # Choose your compiler F90 = mpif90 EXTOBJ = $(OBJDIR)/*.o $(BASISDIR)/*.o all: dirs basis TAGS src/srcinfo.h $(EXEC) basis: (cd $(BASISDIR); make; cd $(PREFIX);) dirs: mkdir -p $(BINDIR) mkdir -p $(OBJDIR) mkdir -p $(MODDIR) TAGS: src/*90 (cd src; etags *.f90 *.h; cd ..) src/srcinfo.h: ( cd src/srcinfo; $(MAKE)) FOBJ = $(OBJDIR)/main.o $(OBJDIR)/control.o $(OBJDIR)/basic_mod.o $(OBJDIR)/prec_const_mod.o $(OBJDIR)/ppsetup.o $(OBJDIR)/ppsync.o $(OBJDIR)/ppinit.o $(OBJDIR)/ppexit.o $(OBJDIR)/array_mod.o $(OBJDIR)/memory.o $(OBJDIR)/numerics.o $(OBJDIR)/compute_curlyNpjmn.o $(OBJDIR)/coeff_mod.o $(EXEC): $(FOBJ) $(F90) $(LDFLAGS) $(EXTOBJ) $(EXTMOD) $(EXTINC) $(EXTLIBS) -o $@ $(OBJDIR)/main.o: src/main.f90 $(OBJDIR)/control.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/main.f90 -o $@ $(OBJDIR)/control.o: src/control.f90 $(OBJDIR)/basic_mod.o $(OBJDIR)/prec_const_mod.o $(OBJDIR)/ppinit.o $(OBJDIR)/ppsetup.o $(OBJDIR)/ppexit.o $(OBJDIR)/numerics.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/control.f90 -o $@ $(OBJDIR)/basic_mod.o: src/basic_mod.f90 $(OBJDIR)/prec_const_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/basic_mod.f90 -o $@ $(OBJDIR)/prec_const_mod.o: src/prec_const_mod.f90 $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/prec_const_mod.f90 -o $@ $(OBJDIR)/ppinit.o: src/ppinit.f90 $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/ppinit.f90 -o $@ $(OBJDIR)/ppsetup.o: src/ppsetup.f90 $(OBJDIR)/prec_const_mod.o $(OBJDIR)/basic_mod.o $(OBJDIR)/array_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/ppsetup.f90 -o $@ $(OBJDIR)/ppsync.o: src/ppsync.f90 $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/ppsync.f90 -o $@ $(OBJDIR)/ppexit.o: src/ppexit.f90 $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/ppexit.f90 -o $@ $(OBJDIR)/array_mod.o: src/array_mod.f90 $(OBJDIR)/basic_mod.o $(OBJDIR)/prec_const_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/array_mod.f90 -o $@ $(OBJDIR)/memory.o: src/memory.f90 $(OBJDIR)/basic_mod.o $(OBJDIR)/array_mod.o $(OBJDIR)/prec_const_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/memory.f90 -o $@ $(OBJDIR)/numerics.o: src/numerics.f90 $(OBJDIR)/prec_const_mod.o $(OBJDIR)/basic_mod.o $(OBJDIR)/array_mod.o $(OBJDIR)/compute_curlyNpjmn.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/numerics.f90 -o $@ $(OBJDIR)/compute_curlyNpjmn.o: src/compute_curlyNpjmn.f90 $(OBJDIR)/prec_const_mod.o $(OBJDIR)/basic_mod.o $(OBJDIR)/array_mod.o $(OBJDIR)/coeff_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/compute_curlyNpjmn.f90 -o $@ $(OBJDIR)/coeff_mod.o: src/coeff_mod.f90 $(OBJDIR)/prec_const_mod.o $(F90) -c $(F90FLAGS) $(EPPFLAGS) $(EXTMOD) $(EXTINC) src/coeff_mod.f90 -o $@ clean: cleanobj cleanmod @rm -f src/srcinfo.h @rm -f src/srcinfo/srcinfo.h cleanobj: @rm -f $(OBJDIR)/*o cleanmod: @rm -f $(MODDIR)/*mod @rm -f *.mod cleanbin: @rm -f $(EXEC) ref: (cd src;doxygen Doxyfile; cd ..) (cd doc/latex/; make; cd ../..) install: mkdir new_a; mv 0*.csv new_a (cd new_a; ls 0*.csv > log.in; cd ..) + cp generate_indices.sh new_a + cp fort.90 new_a diff --git a/gkcoulomb_suite/CurlyNpjmn/src/CMakeLists.txt b/gkcoulomb_suite/CurlyNpjmn/src/CMakeLists.txt new file mode 100644 index 0000000..d803b29 --- /dev/null +++ b/gkcoulomb_suite/CurlyNpjmn/src/CMakeLists.txt @@ -0,0 +1,15 @@ +add_library(src array_mod.f90 +basic_mod.f90 +coeff_mod.f90 +compute_curlyNpjmn.f90 +control.f90 +main.f90 +memory.f90 +numerics.f90 +ppexit.f90 +ppinit.f90 +ppsetup.f90 +ppsync.f90 +prec_const_mod.f90 +../../../basis_transformation/T4T5/T4T5_mod.f90 +) diff --git a/gkcoulomb_suite/README b/gkcoulomb_suite/README deleted file mode 100644 index 9e179b3..0000000 --- a/gkcoulomb_suite/README +++ /dev/null @@ -1,15 +0,0 @@ -GK Coulomb Suite -================== - -Prec-compute coefficient to compute the gk coulomb in cosolver - -To install: - -cd CurlyNpjmn; -make; -cd .. - -cd Tljpmf; -make; -cd .. - diff --git a/gkcoulomb_suite/Tljpmf/CMakeLists.txt b/gkcoulomb_suite/Tljpmf/CMakeLists.txt new file mode 100644 index 0000000..e7e3f31 --- /dev/null +++ b/gkcoulomb_suite/Tljpmf/CMakeLists.txt @@ -0,0 +1,39 @@ +# Specify minimum requirements +cmake_minimum_required( VERSION 3.5.2 ) + +# display command line +set(CMAKE_VERBOSE_MAKEFILE ON) + +# Add project and description +project(tljpmf Fortran ) + +# where to find the src code +set(PROJECT_SRC_DIR ${PROJECT_SOURCE_DIR}/src) +MESSAGE ("source path: ${PROJECT_SOURCE_DIR}") +MESSAGE ("source path to src dir: ${PROJECT_SRC_DIR}") + +# where to output the *.mod file +set(CMAKE_Fortran_MODULE_DIRECTORY ${PROJECT_SOURCE_DIR}/mod) + + +#FMlib +set(extern_INCLUDE ${PROJECT_SOURCE_DIR}/../../FM/mod ) +set(extern_LIB ${PROJECT_SOURCE_DIR}/../../FM/lib) + +include_directories(${extern_INCLUDE}) +link_directories (${extern_LIB}) + +# where to output the executable +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) + +# Define executable +add_executable(${PROJECT_NAME} ${PROJECT_SRC_DIR}/main.f90) + +# link src to exectubale +add_subdirectory(src) + +# Link external libraries to executable +target_link_libraries(${PROJECT_NAME} src fm ) + +# compilation flags +set( CMAKE_Fortran_FLAGS_RELEASE "-c -XHost -O3" ) diff --git a/gkcoulomb_suite/Tljpmf/src/CMakeLists.txt b/gkcoulomb_suite/Tljpmf/src/CMakeLists.txt new file mode 100644 index 0000000..1046b68 --- /dev/null +++ b/gkcoulomb_suite/Tljpmf/src/CMakeLists.txt @@ -0,0 +1,14 @@ +add_library(src array_mod.f90 +auxval_mod.f90 +basic_mod.f90 +control.f90 +main.f90 +memory.f90 +model_mod.f90 +numerics_mod.f90 +ppexit.f90 +ppinit.f90 +ppsetup.f90 +ppsync.f90 +prec_const_mod.f90 +../../../basis_transformation/T4T5/T4T5_mod.f90) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..be2d8dc --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,44 @@ +add_library(src +abel_mod.f90 +array_mod.f90 +auxval_mod.f90 +basic_mod.f90 +basic_mpi_mod.f90 +basis_transformation_mod.f90 +coeff_mod.f90 +control.f90 +coulomb_mod.f90 +coulomb_pol_mod.f90 +diagnose.f90 +dougherty_mod.f90 +ei_colls_mod.f90 +endrun.f90 +gkcoulomb_coeffs_mod.f90 +gkcoulomb_mod.f90 +grid_mod.f90 +hirshmansigmar_mod.f90 +ie_colls_mod.f90 +improved_sugama_mod.f90 +main.f90 +memory.f90 +model_mod.f90 +numerical_test.f90 +operator_model_mod.f90 +output_mod.f90 +pitchangle_mod.f90 +ppexit.f90 +ppinit.f90 +ppsetup.f90 +ppsync_e.f90 +ppsync.f90 +ppsync_i.f90 +ppsync_self.f90 +prec_const_mod.f90 +prologue.f90 +readinputs.f90 +restart_mod.f90 +self_colls_mod.f90 +speed_functions_mod.f90 +sugama_mod.f90 +timer_mod.f90 +../basis_transformation/T4T5/T4T5_mod.f90) diff --git a/src/T4T5_mod.f90 b/src/T4T5_mod_old.f90 similarity index 100% rename from src/T4T5_mod.f90 rename to src/T4T5_mod_old.f90 diff --git a/src/improved_sugama_mod.f90.bkp b/src/improved_sugama_mod.f90.bkp deleted file mode 100644 index 57cbfec..0000000 --- a/src/improved_sugama_mod.f90.bkp +++ /dev/null @@ -1,254 +0,0 @@ -MODULE improved_Sugama - ! - ! Linearized DK/GK Improved Sugamam Collision operator between species a and b - ! - ! Note: as defined below, the Sugama operator differs from a 2 factor from the original paper due to the definition of the isothermal part of the linearized Coulomb - ! - ! Ref: Sugama et. al., Phsyics of Plasmas 26 (2019) - - USE prec_const - USE basic - USE model - USE FMZM - USE coeff - USE basis_transformation - USE speed_functions - USE auxval - use coulomb_parts - use sugama - - IMPLICIT NONE - - PUBLIC - -CONTAINS - - !_________________________________________________________________ - ! - ! Drift kientic Imoroved Sugama collision operator - SUBROUTINE SugamaImprovedTDK(l,k,rCabT) - ! Add the test correction matrix to DK Sugama. The improved Sugama collision operator reproduces the same friction-flow relations as the lineared DK full Coulomb collision operator [see Eqs. (12) and (13) in Ref. [1]] - ! - ! - ! - ! Ref[1]: Sugama et al, Phys. Plasmas 26, 102108 (2019) - - IMPLICIT NONE - ! - INTEGER, intent(in) :: l,k - TYPE(FM), DIMENSION(:),INTENT(INOUT):: rCabT - ! - ! - ! local vars. - INTEGER :: j,i,g,h,icol - TYPE(FM), SAVE :: NX0,NX1,T4,T4inv,NX2,cj_,ci_ - TYPE(FM), SAVE :: DeltaMablk_ - CHARACTER(len=T4len) :: T4str_ - ! - CALL FM_ENTER_USER_ROUTINE - ! - ! construct DK Test Sugama - CALL SugamaTDK(l,k, rCabT) - ! - ! add correction matrix elements \Delta C_{ab}^{FLS} - IF( l .ge. 1 .or. k .ge. 1) THEN - ! - NX0 = 1/SQRT(TO_FM(2)**l*FACTORIAL(TO_FM(l))) - ! - ! - jloop: DO j=0, k + floor(real(l)/2) - NX1 = 4*FACTORIAL(TO_FM(2*j + 3)/2)/FACTORIAL(TO_FM(j))/3/SQRT(PIFM) - cj_ = CJ(j) - T4str_ = GET_T4(1,j,l,k) ! ... T^{lk}_{gh} - T4inv = SQRT(PIFM)*(TO_FM(2)**l)*FACTORIAL(TO_FM(l))*FACTORIAL(TO_FM(j))*TO_FM(2 + 1)/2/FACTORIAL(TO_FM(2+2*j +1)/2)*TO_FM(T4str_) - IF( T4inv .ne. TO_FM(0)) THEN - - iloop: DO i=0,imaxx ! .... energy moment - ci_ = CJ(i) - ! Complute test correction matrix - DeltaMablk_= DELTAMlk(j,i) - gloop: DO g =0,min(2*i +1,Pmaxa) - NX2 = SQRT(TO_FM(2)**g*FACTORIAL(TO_FM(g))) - hloop: DO h=0,min(i,Jmaxa) - T4str_ = GET_T4(1,i,g,h) ! ... T^{lk}_{gh} - T4 = TO_FM(T4str_) - icol = numba(g,h) - rCabT(icol) = rCabT(icol) + NX0*NX1*NX2*T4inv*T4*cj_*ci_*DeltaMablk_ - ENDDO hloop - ENDDO gloop - ENDDO iloop - ENDIF - ENDDO jloop - ENDIF - ! - ! - CALL FM_EXIT_USER_ROUTINE - ! - END SUBROUTINE SugamaImprovedTDK - ! - !_________________________________________________________________ - ! - SUBROUTINE SugamaImprovedFDK(l,k,rCabF) - ! Add field correction matrix to DK Sugama. The improved Sugama collision operator reproduces the same friction-flow relations as the lineared DK full Coulomb collision operator [see Eqs. (12) and (13) in Ref. [1]] - ! - ! - ! - ! Ref[1]: Sugama et al, Phys. Plasmas 26, 102108 (2019) - - IMPLICIT NONE - ! - INTEGER, intent(in) :: l,k - TYPE(FM), DIMENSION(:),INTENT(INOUT):: rCabF - ! - ! - ! local vars. - INTEGER :: j,i,g,h,icol - TYPE(FM), SAVE :: NX0,NX1,T4,T4inv,NX2,cj_,ci_ - TYPE(FM), SAVE :: DeltaNablk_ - CHARACTER(len=T4len) :: T4str_ - ! - CALL FM_ENTER_USER_ROUTINE - ! - ! construct Sugama Field part - CALL SugamaFDK(l,k, rCabF) - ! - ! add correction matrix elements \Delta C_{ab}^{FLS} - IF( l .ge. 1 .or. k .ge. 1) THEN - ! - NX0 = 1/SQRT(TO_FM(2)**l*FACTORIAL(TO_FM(l))) - ! - ! - jloop: DO j=0, k + floor(real(l)/2) - NX1 = 4*FACTORIAL(TO_FM(2*j + 3)/2)/FACTORIAL(TO_FM(j))/3/SQRT(PIFM) - cj_ = CJ(j) - T4str_ = GET_T4(1,j,l,k) ! ... T^{lk}_{gh} - T4inv = SQRT(PIFM)*(TO_FM(2)**l)*FACTORIAL(TO_FM(l))*FACTORIAL(TO_FM(j))*TO_FM(2 + 1)/2/FACTORIAL(TO_FM(2+2*j +1)/2)*TO_FM(T4str_) - IF( T4inv .ne. TO_FM(0)) THEN - - iloop: DO i=0,imaxx ! ... energy moment - ci_ = CJ(i) - ! Complute test correction matrix - DeltaNablk_= DELTANlk(j,i) - gloop: DO g =0,min(2*i +1,Pmaxb) - NX2 = SQRT(TO_FM(2)**g*FACTORIAL(TO_FM(g))) - hloop: DO h=0,min(i,Jmaxb) - T4str_ = GET_T4(1,i,g,h) ! ... T^{lk}_{gh} - T4 = TO_FM(T4str_) - icol = numbb(g,h) - rCabF(icol) = rCabF(icol) + NX0*NX1*NX2*T4inv*T4*cj_*ci_*DeltaNablk_ - ENDDO hloop - ENDDO gloop - ENDDO iloop - ENDIF - ENDDO jloop - ENDIF - ! - ! - CALL FM_EXIT_USER_ROUTINE - ! - END SUBROUTINE SugamaImprovedFDK - !_________________________________________________________________ - ! - ! - SUBROUTINE SugamaImprovedSelfDK(l,k,rCaa) - ! Add correction matrix to self DK Sugama. The improved Sugama collision operator reproduces the same friction-flow relations as the lineared DK full Coulomb collision operator [see Eqs. (12) and (13) in Ref. [1]] - ! - ! - ! - ! Ref[1]: Sugama et al, Phys. Plasmas 26, 102108 (2019) - - IMPLICIT NONE - ! - INTEGER, intent(in) :: l,k - TYPE(FM), DIMENSION(:),INTENT(INOUT):: rCaa - ! - ! - ! local vars. - INTEGER :: j,i,g,h,icol - TYPE(FM), SAVE :: NX0,NX1,T4,T4inv,NX2,cj_,ci_ - TYPE(FM), SAVE :: DeltaMaalk_,DeltaNaalk_ - CHARACTER(len=T4len) :: T4str_ - ! - CALL FM_ENTER_USER_ROUTINE - ! - ! Construct self DK Sugama - CALL SugamaSelfDK(l,k,rCaa) - - ! - ! add correction matrix elements \Delta C_{ab}^{FLS} - IF( l .ge. 1 .or. k .ge. 1) THEN - ! - NX0 = 1/SQRT(TO_FM(2)**l*FACTORIAL(TO_FM(l))) - ! - ! - jloop: DO j=0, k + floor(real(l)/2) - NX1 = 4*FACTORIAL(TO_FM(2*j + 3)/2)/FACTORIAL(TO_FM(j))/3/SQRT(PIFM) - cj_ = CJ(j) - T4str_ = GET_T4(1,j,l,k) ! ... T^{lk}_{gh} - T4inv = SQRT(PIFM)*(TO_FM(2)**l)*FACTORIAL(TO_FM(l))*FACTORIAL(TO_FM(j))*TO_FM(2 + 1)/2/FACTORIAL(TO_FM(2+2*j +1)/2)*TO_FM(T4str_) - IF( T4inv .ne. TO_FM(0)) THEN - - iloop: DO i=0,imaxx - ci_ = CJ(i) - ! Complute test and field correction matrix - DeltaNaalk_= DeltaNlk(j,i) - DeltaMaalk_= DeltaMlk(j,i) - gloop: DO g =0,min(2*i +1,Pmaxa) - NX2 = SQRT(TO_FM(2)**g*FACTORIAL(TO_FM(g))) - hloop: DO h=0,min(i,Jmaxa) - T4str_ = GET_T4(1,i,g,h) ! ... T^{lk}_{gh} - T4 = TO_FM(T4str_) - icol = numba(g,h) - rCaa(icol) = rCaa(icol) + NX0*NX1*NX2*T4inv*T4*cj_*ci_*(DeltaNaalk_ + DeltaMaalk_) - ENDDO hloop - ENDDO gloop - ENDDO iloop - ENDIF - ENDDO jloop - ENDIF - ! - ! - CALL FM_EXIT_USER_ROUTINE - ! - END SUBROUTINE SugamaImprovedSelfDK - ! - ! - ! GYROKINETIC IMPROVED FIELD SUGAMA - ! - ! - !_________________________________________________________________ - SUBROUTINE SugamaImprovedTGK(l,k,rCabT) - ! - ! - IMPLICIT NONE - ! - INTEGER,INTENT(in) :: l,k - TYPE(FM),dimension(:),INTENT(INOUT) :: rCabT - ! - CALL FM_ENTER_USER_ROUTINE - ! - ! CODE HERE ...... !! - ! - CALL FM_EXIT_USER_ROUTINE - ! - END SUBROUTINE SugamaImprovedTGK - ! - !__________________________________________ - ! - SUBROUTINE SugamaImprovedFGK(l,k,rCabF) - ! - ! - IMPLICIT NONE - ! - INTEGER,INTENT(in) :: l,k - TYPE(FM),dimension(:),INTENT(INOUT) :: rCabF - ! - CALL FM_ENTER_USER_ROUTINE - ! - ! CODE HERE ...... !! - ! - CALL FM_EXIT_USER_ROUTINE - ! - END SUBROUTINE SugamaImprovedFGK - -END MODULE improved_Sugama diff --git a/src/spec_fcts_mod.f90 b/src/spec_fcts_mod.f90 deleted file mode 100644 index dd44b19..0000000 --- a/src/spec_fcts_mod.f90 +++ /dev/null @@ -1,48 +0,0 @@ -module spec_fcts -! -! this module contains specfial functions -! -! List of functions : - -use prec_const -private - -public :: Factorial - -contains - - -!-------------------------------------------------------! - real(dp) function Factorial( val ) result( return_value ) - ! Evaluates factorial for real positive, and negative half-integer numbers. - - implicit none - integer :: ival, iloop - real(dp) :: bval, rval, step - real(dp), intent(in) :: val - - return_value = 1._dp - bval = 1.0_dp - step = sign(1._dp,val) - rval = step - ival = abs(nint(val+0.25_dp)) - ! If we're dealing with half-integers, recursion relation with sqrt(PI) - - if( modulo(val,1.0_dp) > 0.25_dp ) then - bval = SQRTPI - rval = 0.5_dp * rval - end if - do iloop = 1, ival - return_value = return_value * rval - rval = rval + step - end do - if( val < 0._dp ) return_value = 1._dp / return_value - return_value = return_value * bval - - end function Factorial -!-------------------------------------------------------! - - - - -end module spec_fcts