diff --git a/src/ei_colls_mod.f90 b/src/ei_colls_mod.f90 index 9b5e0b2..bfb7c90 100644 --- a/src/ei_colls_mod.f90 +++ b/src/ei_colls_mod.f90 @@ -1,425 +1,425 @@ MODULE ei_colls ! electron-ion collisions module USE PREC_CONST USE MODEL USE BASIC USE BASIC_MPI use grid USE ARRAY, only : CeiTdp,CeiFdp,rCeiT,rCeiF USE OPERATOR_MODEL USE OUTPUT use auxval USE restart use gkcoulomb IMPLICIT NONE PROCEDURE(eval_CeiT), POINTER :: evaluate_CeiT_collisional_matrix => null() PROCEDURE(eval_CeiF), POINTER :: evaluate_CeiF_collisional_matrix => null() ABSTRACT INTERFACE SUBROUTINE eval_CeiT ! Empty END SUBROUTINE eval_CeiT END INTERFACE ABSTRACT INTERFACE SUBROUTINE eval_CeiF ! Empty END SUBROUTINE eval_CeiF END INTERFACE CONTAINS SUBROUTINE ei_colls_control ! Set electron-ions basic/model IMPLICIT NONE ! IF(me_e .eq. 0) WRITE(*,*) '===== Electron-Ion Collisions =====' IF(me_e .eq. 0) WRITE(*,*) 'Set Electron-Ion Collision ...' CALL set_ei_colls IF( ETEST .ne. 0) THEN IF(me_e .eq. 0) WRITE(*,*) 'Construct collisional matrices CeiT ... ' CALL evaluate_auxval_test ! Restart IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('eiT') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF call set_CeiT_collisional_matrix CALL evaluate_CeiT_collisional_matrix WRITE(*,*) '... CeiT constructed, me =',me_e ENDIF IF( EBACK .ne. 0) THEN IF(me_e .eq. 0) WRITE(*,*) 'Construct collisional matrices CeiF ... ' call evaluate_auxval_field IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('eiF') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF call set_CeiF_collisional_matrix CALL evaluate_CeiF_collisional_matrix WRITE(*,*) '... CeiF constructed, me =',me_e ENDIF ! END SUBROUTINE ei_colls_control ! !------------------------------------------------ ! SUBROUTINE set_ei_colls ! Set electron-ions basic/model IMPLICIT NONE ! CALL set_model('ei') CALL set_basic('ei') ! END SUBROUTINE set_ei_colls ! !------------------------------------------------ ! ! TEST COMPONENT ! SUBROUTINE set_CeiT_collisional_matrix ! Evaluate the electron-ion test collisional matrix IMPLICIT NONE ! ! IF( ETEST .ne. 0 ) THEN IF(IFCOULOMB .and. GKE .and. ETEST .eq. 1) THEN evaluate_CeiT_collisional_matrix => CeiT_gk_coulomb call set_gkcoulomb ! IF( .not. GKC_USE_FULL) THEN call load_gk_coulomb_coeffs('eiT') ELSE call set_tabljpmf('t') ENDIF ! ELSE ! evaluate_CeiT_collisional_matrix => CeiT_dflt ! ENDIF ELSE evaluate_CeiT_collisional_matrix => CeiT_zeros_dflt ENDIF ! END SUBROUTINE set_CeiT_collisional_matrix ! !---------------------------------------------------- ! SUBROUTINE CeiT_dflt ! Evaluate the electron-ion collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! ! Local variables INTEGER :: irow,irow_tmp INTEGER, DIMENSION(2) :: lk INTEGER :: istep, lbar_start ! Allocate restart coll mat and restart indices IF(restart_from) CALL get_restart(CeiTdp) lbar_start = lbare_s_l IF(restart_from) lbar_start = row_rst_l +1 istep=1 ! ! Test-part IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiT [x/ ', lbare_e_l ,']:' ! IF (ETEST .ne. 0) THEN DO irow=lbar_start,lbare_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) rCeiT(:)= TO_FM(0) write(nscr,'(i5)', advance = 'no') irow_tmp flush(nscr) CALL COLLISIONTE(lk(1),lk(2),rCeiT) CeiTdp(irow,:) = TO_DP(rCeiT(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ei) THEN call restart_out(CeiTdp, irow) istep = 1 ENDIF ENDDO ENDIF ! IF(ifrestart) call restart_out(CeiTdp,irow) ! END SUBROUTINE CeiT_dflt ! !-------------------------------------------------------------- ! SUBROUTINE CeiT_gk_coulomb ! Evaluate electron-ion test GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart( CeiTdp ) ! ! initialize indices lbar_start = lbare_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbare_s_l ENDIF istep=1 ! - IF( me .eq. 0 ) write(*,*) 'CeiT [x / ', lbare_e_l,'] :' + IF( me .eq. 0 ) write(*,*) 'CeiT [x / ', numbe(Pmaxe,Jmaxe),'] :' ! DO irow=lbar_start,lbare_e_l lbarjnnp = rows_e_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbe(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCeiT(:) = ZEROFM CALL coulombTGK(lk(1),lk(2),j,n,np,rCeiT) CeiTdp(irow,:) = TO_DP(rCeiT(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ei) THEN ! flush current state every nsave_ei. call restart_out(CeiTdp, irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(CeiTdp, irow) ! END SUBROUTINE CeiT_gk_Coulomb ! !------------------------------------------------ ! SUBROUTINE CeiT_zeros_dflt ! Evaluate the electron-ion collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! ! Local variables INTEGER :: irow,irow_tmp INTEGER, DIMENSION(2) :: lk ! - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiT [x/ ', lbare_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiT [x/ ', numbe(Pmaxe,Jmaxe) ,']:' ! Test-part IF (ETEST .ne. 0) THEN DO irow=lbare_s_l,lbare_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) rCeiT(:)= TO_FM(0) write(nscr,'(i5)', advance = 'no') irow flush(nscr) CeiTdp(irow,:) = TO_DP(rCeiT(:)) ENDDO ENDIF ! ! END SUBROUTINE CeiT_zeros_dflt ! !-------------------------------------------------------------- ! ! FIELD COMPONENT ! SUBROUTINE set_CeiF_collisional_matrix ! Evaluate the electron-ion collisional matrix IMPLICIT NONE ! ! IF (EBACK .ne. 0 ) THEN IF(IFCOULOMB .and. GKE .and. EBACK .eq. 1) THEN evaluate_CeiF_collisional_matrix => CeiF_gk_coulomb ! call set_gkcoulomb ! IF (.not. GKC_USE_FULL) THEN call load_gk_coulomb_coeffs('eiF') ELSE call set_tabljpmf('f') ENDIF ! ELSE evaluate_CeiF_collisional_matrix =>CeiF_dflt ! ENDIF ELSE evaluate_CeiF_collisional_matrix => CeiF_zeros_dflt ENDIF ! END SUBROUTINE set_CeiF_collisional_matrix ! !---------------------------------------------------- SUBROUTINE CeiF_dflt ! Evaluate the electron-ion collisional matrix ! Computes the back-reaction collisional matrix. ! ! IMPLICIT NONE ! INTEGER :: irow,irow_tmp, lbar_start, istep INTEGER, DIMENSION(2) :: lk ! Allocate restart coll mat and restart indices IF(restart_from) CALL get_restart(CeiFdp) lbar_start = lbare_s_l IF(restart_from) lbar_start = row_rst_l +1 istep=1 IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiF [x/ ', lbare_e_l ,']:' ! Back-Reaction IF (EBACK .ne. 0) THEN DO irow=lbar_start,lbare_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) write(nscr,'(i5)', advance = 'no') irow flush(nscr) rCeiF(:) = TO_FM(0) CALL COLLISIONFE(lk(1),lk(2),rCeiF) CeiFdp(irow,:) = TO_DP(rCeiF(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ei) THEN call restart_out(CeiFdp, irow) istep = 1 ENDIF ENDDO ENDIF ! ! IF(ifrestart) call restart_out(CeiFdp, irow) ! END SUBROUTINE CeiF_dflt ! !-------------------------------------------- ! SUBROUTINE CeiF_gk_coulomb ! Evaluate electron-ion field GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart(CeiFdp) ! ! initialize indices lbar_start = lbare_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbare_s_l ENDIF istep=1 ! - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiF [x/ ', lbare_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CeiF [x/ ', numbe(Pmaxe,Jmaxe) ,']:' ! DO irow=lbar_start,lbare_e_l lbarjnnp = rows_e_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbe(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCeiF(:) = ZEROFM CALL coulombFGK(lk(1),lk(2),j,n,np,rCeiF) CeiFdp(irow,:) = TO_DP(rCeiF(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ei) THEN ! flush current state every nsave_ei. call restart_out(CeiFdp, irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(CeiFdp, irow) ! END SUBROUTINE CeiF_gk_Coulomb ! !-------------------------------------------------- ! SUBROUTINE CeiF_zeros_dflt ! Evaluate the electron-ion collisional matrix ! Computes the back-reaction collisional matrix. ! ! IMPLICIT NONE ! INTEGER :: irow,irow_tmp INTEGER, DIMENSION(2) :: lk ! Back-Reaction IF (EBACK .ne. 0) THEN DO irow=lbare_s_l,lbare_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) write(*,*) 'CeiF: ',lk(1),'/',Pmaxe,' ,',lk(2),'/',Jmaxe rCeiF(:) = TO_FM(0) CeiFdp(irow,:) = TO_DP(rCeiF(:)) ENDDO ENDIF ! ! END SUBROUTINE CeiF_zeros_dflt ! END MODULE ei_colls diff --git a/src/ie_colls_mod.f90 b/src/ie_colls_mod.f90 index e464d32..61d085d 100644 --- a/src/ie_colls_mod.f90 +++ b/src/ie_colls_mod.f90 @@ -1,438 +1,438 @@ module ie_colls ! ion-electron collisions module USE PREC_CONST USE MODEL use grid USE BASIC USE BASIC_MPI USE restart USE ARRAY, only : CieTdp,CieFdp,rCieT,rCieF USE OPERATOR_MODEL use auxval use gkcoulomb implicit none PROCEDURE(CieT_sub), POINTER :: evaluate_CieT_collisional_matrix => null() PROCEDURE(CieF_sub), POINTER :: evaluate_CieF_collisional_matrix => null() ABSTRACT INTERFACE SUBROUTINE CieT_sub ! Empty END SUBROUTINE CieT_sub END INTERFACE ABSTRACT INTERFACE SUBROUTINE CieF_sub ! Empty END SUBROUTINE CieF_sub END INTERFACE contains ! !------------------------------------------------ ! subroutine ie_colls_control ! ie colls implicit none IF(me_i .eq. 0) WRITE(*,*) '====== Ion-Electron Collisions =======' IF(me_i .eq. 0) WRITE(*,*) 'Set Ion-Electron Collision ...' CALL set_ie_colls IF( ITEST .ne. 0) THEN CALL evaluate_auxval_test IF(me_i .eq. 0) WRITE(*,*) 'Construct collisional matrices CieT ... ' ! Restart IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('ieT') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF call set_CieT_collisional_matrix CALL evaluate_CieT_collisional_matrix WRITE(*,*) '... CieT constructed, me =', me_i ENDIF IF( IBACK .ne. 0) THEN IF(me_i .eq. 0) WRITE(*,*) 'Construct collisional matrices CieF ... ' call evaluate_auxval_field ! Restart IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('ieF') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF call set_CieF_collisional_matrix CALL evaluate_CieF_collisional_matrix WRITE(*,*) '... CieF constructed, me =', me_i ENDIF end subroutine ie_colls_control ! !------------------------------------------------ ! SUBROUTINE set_ie_colls ! Set ion-electron basic/model IMPLICIT NONE ! CALL set_model('ie') ! CALL set_basic('ie') ! END SUBROUTINE set_ie_colls ! !------------------------------------------------ ! ! TEST COMPONENT ! SUBROUTINE set_CieT_collisional_matrix ! Evaluate the electron-ion test collisional matrix IMPLICIT NONE ! ! IF( ITEST .ne. 0 ) THEN IF(IFCOULOMB .and. GKI .and. ITEST .eq. 1) THEN ! evaluate_CieT_collisional_matrix => CieT_gk_coulomb call set_gkcoulomb ! IF ( .not. GKC_USE_FULL) then call load_gk_coulomb_coeffs('ieT') else call set_tabljpmf('t') endif ! ELSE ! evaluate_CieT_collisional_matrix => CieT_dflt ! ENDIF ELSE evaluate_CieT_collisional_matrix => CieT_zeros_dflt ENDIF ! END SUBROUTINE set_CieT_collisional_matrix ! !---------------------------------------------------- ! SUBROUTINE CieT_dflt ! Evaluate the ion-electron collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! INTEGER :: irow,irow_tmp, lbar_start, istep INTEGER, DIMENSION(2) :: lk ! restart IF(restart_from) CALL get_restart(CieTdp) ! ! initialize indices lbar_start = lbari_s_l IF(restart_from) lbar_start = row_rst_l +1 istep=1 ! - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieT [x/ ', lbari_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieT [x/ ', numbi(Pmaxi,Jmaxi) ,']:' ! Test-part IF( ITEST .ne. 0) THEN DO irow=lbar_start,lbari_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(nscr,'(i5)', advance = 'no') irow_tmp flush(nscr) rCieT(:) = TO_FM('0') CALL COLLISIONTI(lk(1),lk(2),rCieT) CieTdp(irow,:) = TO_DP(rCieT(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ie) THEN ! flush current state every nsave_ie. call restart_out(CieTdp,irow) istep = 1 ENDIF ENDDO ENDIF ! ! flush out the final state IF(ifrestart) call restart_out(CieTdp,irow) END SUBROUTINE CieT_dflt ! !-------------------------------------------------------------- ! SUBROUTINE CieT_gk_coulomb ! Evaluate ion-electron test GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart(CieTdp) ! ! initialize indices lbar_start = lbari_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbari_s_l ENDIF istep=1 ! - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieT [x/ ', lbari_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieT [x/ ', numbi(Pmaxi,Jmaxi) ,']:' DO irow=lbar_start,lbari_e_l lbarjnnp = rows_i_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbi(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCieT(:) = ZEROFM CALL coulombTGK(lk(1), lk(2),j, n, np, rCieT) CieTdp(irow,:) = TO_DP(rCieT(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ie) THEN ! flush current state every nsave_ie. call restart_out(CieTdp, irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(CieTdp, irow ) ! END SUBROUTINE CieT_gk_Coulomb ! !------------------------------------------------ ! SUBROUTINE CieT_zeros_dflt ! Evaluate the ion-electron collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! INTEGER :: irow,irow_tmp INTEGER, DIMENSION(2) :: lk INTEGER :: lbar_start, istep ! restart IF(restart_from) CALL get_restart(CieTdp) ! ! initialize indices lbar_start = lbari_s_l IF(restart_from) lbar_start = row_rst_l +1 istep=1 ! Test-part IF( ITEST .ne. 0) THEN DO irow=lbari_s_l,lbari_e_l ! Get Hermite-Laguerre indices irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(*,'(a,1x,i3,a,i3,a,i3,a,i3)') 'CieT:', lk(1),'/',Pmaxi, ', ',lk(2),'/',Jmaxi rCieT(:) = TO_FM('0') CieTdp(irow,:) = TO_DP(rCieT(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ie) THEN ! flush current state every nsave_ie. call restart_out(CieTdp, irow) istep = 1 ENDIF ENDDO ENDIF ! END SUBROUTINE CieT_zeros_dflt ! !-------------------------------------------------------------- ! ! FIELD COMPONENT ! SUBROUTINE set_CieF_collisional_matrix ! Evaluate the ion-electron collisional matrix IMPLICIT NONE ! IF (IBACK .ne. 0 ) THEN IF(IFCOULOMB .and. GKI .and. IBACK .eq. 1 ) THEN ! evaluate_CieF_collisional_matrix => CieF_gk_coulomb call set_gkcoulomb IF(.not. GKC_USE_FULL) then call load_gk_coulomb_coeffs('ieF') else call set_tabljpmf('f') endif ! ELSE evaluate_CieF_collisional_matrix => CieF_dflt ! ENDIF ELSE evaluate_CieF_collisional_matrix => CieF_zeros_dflt ENDIF ! END SUBROUTINE set_CieF_collisional_matrix ! !-------------------------------------------------------------- ! SUBROUTINE CieF_dflt ! Evaluate the ion-electron collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! ! Local variables INTEGER :: irow,irow_tmp INTEGER :: lbar_start, istep INTEGER, DIMENSION(2) :: lk ! restart IF(restart_from) CALL get_restart(CieFdp) ! ! initialize indices lbar_start = lbari_s_l IF(restart_from) lbar_start = row_rst_l +1 istep=1 - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieF [x/ ', lbari_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieF [x/ ', numbi(Pmaxi,Jmaxi) ,']:' ! Back-Reaction IF (IBACK .ne. 0) THEN DO irow = lbari_s_l,lbari_e_l irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(nscr,'(i5)', advance = 'no') irow flush(nscr) rCieF(:) = TO_FM('0') CALL COLLISIONFI(lk(1),lk(2),rCieF) CieFdp(irow,:) = TO_DP(rCieF(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ie) THEN ! flush current state every nsave_ie. call restart_out(CieFdp, irow ) istep = 1 ENDIF ENDDO ENDIF ! flush out the final state IF(ifrestart) call restart_out(CieFdp, irow) ! END SUBROUTINE CieF_dflt ! !-------------------------------------------------------------- ! SUBROUTINE CieF_gk_coulomb ! Evaluate ion-electron field GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart(CieFdp) ! ! initialize indices lbar_start = lbari_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbari_s_l ENDIF istep=1 ! IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'CieF [x/ ', lbari_e_l ,']:' DO irow=lbar_start,lbari_e_l lbarjnnp = rows_i_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbi(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCieF(:) = ZEROFM CALL coulombFGK(lk(1),lk(2),j,n,np,rCieF) CieFdp(irow,:) = TO_DP(rCieF(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ie) THEN ! flush current state every nsave_ie. call restart_out(CieFdp, irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(CieFdp, irow) ! END SUBROUTINE CieF_gk_Coulomb ! !--------------------------------------------------------------- ! SUBROUTINE CieF_zeros_dflt ! Evaluate the ion-electron collisional matrix ! Computes the test collisional matrix. ! ! IMPLICIT NONE ! ! Local variables INTEGER :: irow,irow_tmp INTEGER, DIMENSION(2) :: lk ! Back-Reaction IF (IBACK .ne. 0) THEN DO irow = lbari_s_l,lbari_e_l irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(*,*) 'CieF:', lk(1),'/',Pmaxi, ', ',lk(2),'/',Jmaxi rCieF(:) = TO_FM('0') CieFdp(irow,:) = TO_DP(rCieF(:)) ENDDO ENDIF END SUBROUTINE CieF_zeros_dflt ! end module ie_colls diff --git a/src/model_mod.f90 b/src/model_mod.f90 index c50bf5b..06e69e2 100644 --- a/src/model_mod.f90 +++ b/src/model_mod.f90 @@ -1,729 +1,730 @@ module model ! phyical parameters use prec_const use FMZM use basic IMPLICIT NONE PRIVATE ! physical parameters real(dp), public, protected :: nu = 1._dp ! electron-ion collision freq. real(dp), public, protected :: sigmaei =1._dp ! me/ mi real(dp), public, protected :: tauie = 1._dp ! T_i0/T_e0 real(dp), public, protected :: kperp = 1._dp ! perpendicular wavenumber normalized to cs ! kperp scan logical, public, protected :: kpscan = .false. ! if .true., run kperp scan integer, public, protected :: iks, ike, ik_current integer, public, protected :: ikp_start = 1 - + real(dp), dimension(:), allocatable :: kperp_array - character(len = 64) :: kscanfile + character(len = slen) :: kpscanfile = 'kperp.in' ! electron-ion mass/temperature ratio real(dp), public, protected :: sigmaaa,sigmaie real(dp), public, protected :: tauei, tauaa real(dp), public, protected :: sigma_ = 1._dp ! real(dp), public, protected :: tau_ = 1._dp ! real(dp), public, protected :: chi_ = 1._dp ! real(dp), public, protected :: be_ = 0._dp ! perpendicular wavenumber normalized to electron thermal Larmor radius real(dp), public, protected :: bi_ = 0._dp ! perpendicular wavenumber normalized to electron thermal Larmor radius real(dp), public, protected :: ba_ = 0._dp real(dp), public, protected :: bb_ = 0._dp ! Multiple-Precision FM type TYPE(FM), public, protected :: sigmafm_ ! mass ratio TYPE(FM), public, protected :: taufm_ ! temperature ratio TYPE(FM), public, protected :: chifm_ ! SQRT(tau/sigma) = vTa/vTb TYPE(FM), public, protected :: thetaabfm_ ! Sugama theta_{ab} coefficient [see Eq. (29) in Sugama et al. (2009)] TYPE(FM), public, protected :: thetabafm_ ! Sugma theta_{ba} coefficient TYPE(FM), public, protected :: bafm_ TYPE(FM), public, protected :: bbfm_ ! ! Test/Back-Reaction Model Collision Operator ! electron collision model CHARACTER(slen), protected ,public :: etest_coll = 'none' CHARACTER(slen), protected ,public :: eback_coll = 'none' CHARACTER(slen), protected ,public :: eself_coll = 'none' ! ion collision model CHARACTER(slen), protected , public :: itest_coll = 'none' CHARACTER(slen), protected , public :: iback_coll = 'none' CHARACTER(slen), protected , public:: iself_coll = 'none' INTEGER, PUBLIC :: ETEST=0 ! Electron Test Model INTEGER, PUBLIC :: ITEST=0 ! Ion Test Model INTEGER, PUBLIC :: EBACK=0 ! Electron Back-Reaction Model INTEGER, PUBLIC :: IBACK=0 ! Ion Back-Reaction Model INTEGER, PUBLIC :: ESELF=0 ! Electron self Model INTEGER, PUBLIC :: ISELF=0 ! Ion Self Model INTEGER, PUBLIC :: GKE =0 ! Gyrokinetic Electrons INTEGER, PUBLIC :: GKI =0 ! Gyrokinetic Ions LOGICAL, PUBLIC :: ADD_IS_TO_OS = .False. ! add improved sugama to originial sugama ! Apply long wavelength limit to GK collision operators LOGICAL, PUBLIC :: LWL = .FALSE. ! routine to compute gk coulomb LOGICAL , PUBLIC :: GKC_USE_FULL = .false. ! if true, use explicit routine, false, use precomputed quantities LOGICAL , PUBLIC :: GKC_USE_OPT = .false. ! if true, use optimized routine, false, use precomputed quantities without optimized version ! Colliding species CHARACTER(len=2), PUBLIC, PROTECTED :: coll_ab ! Sugama Flag: used in AUXVAL for error functions necessary for back-reaction parts LOGICAL, PUBLIC, PROTECTED :: IFSUGAMA = .FALSE. ! Improved Sugama Flag: used in AUXVAL and MEMORY for precomputation of CurlI(para/perp)(a/b)pjk in GK mode LOGICAL, PUBLIC, PROTECTED :: IFIMPROVEDSUGAMA = .FALSE. ! Coulomb flag LOGICAL, PUBLIC, PROTECTED :: IFCOULOMB = .FALSE. ! Polarization flag LOGICAL, PUBLIC, PROTECTED :: IFPOL = .FALSE. ! solve Poisson for polarizion term TYPE(FM), public :: poisson_coeff ! ion polarization and adiabatic electron coeff. ! Zeroth order Hirshman Sigmar Clarke flag logical, PUBLIC, protected :: IF0HSC = .false. ! GK Abel flag: used in AUXVAL for error functions necessary for back-reaction parts logical, PUBLIC, protected :: IFABEL = .false. ! DK/GK test or/and field: used only if GKI and/or GKE ! Note: implented only for Abel collision operator logical, PUBLIC, protected :: DKBACK = .false. ! use DK back reaction logical, PUBLIC, protected :: DKTEST = .false. ! use DK test part ! Flag turn on/off Test/Field parts logical, public, protected :: ADDBACK =.true. ! IF 1 add field part, 0 otherwise logical, public, protected :: ADDTEST=.true. ! IF 1 add test part, 0 otherwise ! Gyrokinetic flag LOGICAL, PUBLIC, PROTECTED :: IFGK = .FALSE. public :: model_readinputs, set_model,set_model_fm,operatormodel_readinput,invert_model, set_model_var, set_kpscan, update_kperp contains !================================================================================ subroutine model_readinputs ! Read inputs physical input parameters use basic, only: lu_in,ierr use prec_const implicit none character(len=8) :: fmt = '(f6.4)' - NAMELIST /MODEL_PAR/ nu, sigmaei ,tauie,kperp, kpscan, ikp_start + NAMELIST /MODEL_PAR/ nu, sigmaei ,tauie,kperp, kpscan, ikp_start, kpscanfile IF( me .ne. 0) GOTO 111 read(lu_in,MODEL_PAR) ! write(*,MODEL_PAR) 111 CONTINUE ! We compute the normalized collisional matrix nu = 1._dp ! ! Broadcast from PE 0 to ! CALL MPI_bcast(nu,1, MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(sigmaei, 1, MPI_DOUBLE_PRECISION, 0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(tauie, 1,MPI_DOUBLE_PRECISION, 0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(kperp,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(kpscan,1,MPI_logical, 0, MPI_COMM_WORLD,ierr) CALL MPI_bcast(ikp_start,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) + CALL MPI_bcast(kpscanfile, slen , MPI_CHARACTER,0,MPI_COMM_WORLD,ierr) ! call set_model_var ! end subroutine model_readinputs !================================================================================ subroutine set_model_var implicit none ! set electron-ion mass/temperature ratio !! defined as me/mi !!!!!! sigmaie = 1/sigmaei sigmaaa = 1._dp tauei = 1/tauie tauaa = 1._dp ! Set electron/ion perpendicular wavenumber be_ = kperp*SQRT(2._dp)*SQRT(sigmaei) bi_ = kperp*SQRT(2._dp)*SQRT(tauei) if( .not. kpscan) then iks = 1 ike = 1 endif end subroutine set_model_var ! !================================================================================ ! subroutine set_kpscan ! set kperp scan implicit none logical :: exist_ integer :: fid, nk, endof real(dp) :: buff_ - kscanfile = 'kperp.in' + !! kscanfile = 'kperp.in' IF( me .eq. 0) WRITE(*,*) "Run kperp scan ... " - INQUIRE(FILE=kscanfile, EXIST=exist_) + INQUIRE(FILE=kpscanfile, EXIST=exist_) IF(.not. exist_) THEN ERROR STOP("kperp.in file not found... ") ENDIF ! read scanlist - open(fid,FILE= kscanfile) + open(fid,FILE= kpscanfile) endof = .false. nk =0 do while( endof .eq. 0) read( fid, *, iostat = endof) buff_ nk = nk +1 enddo nk = nk-1 close(fid) ! allocate array iks = 1 ike = nk call allocate_array( kperp_array, iks, ike) - open(fid, FILE=kscanfile) + open(fid, FILE=kpscanfile) endof = .false. nk =0 do while( endof .eq. 0) read( fid, *, iostat = endof) buff_ kperp_array( nk+1) = buff_ if( me .eq. 0 .and. endof .eq. 0 ) WRITE(*,*) 'kperp = ', kperp_array( nk+1) nk = nk +1 enddo nk = nk-1 close(fid) ! end subroutine set_kpscan ! !================================================================================ ! subroutine update_kperp(ik) ! implicit none integer, intent(in) :: ik ! update the current ik index to compute ik_current = ik kperp = kperp_array( ik) IF( me .eq. 0) WRITE(*,*) ' update kperp =', kperp call set_model_var end subroutine update_kperp ! !================================================================================ ! subroutine set_model(ab) ! set the species mass/temperature ratios implicit none character(len=2), intent(in) :: ab ! Ion-Ion collisions if(ab .eq. 'ii') then chi_ = 1._dp tau_ = 1._dp sigma_ = 1._dp ba_ = bi_ bb_ = bi_ coll_ab = 'ii' end if ! Electron- Electron collisions if(ab .eq. 'ee') then chi_ = 1._dp tau_ = 1._dp sigma_ = 1._dp ba_ = be_ bb_ = be_ coll_ab = 'ee' end if ! Electron-ion collisions if(ab .eq. 'ei') then chi_ = SQRT(tauei/sigmaei) tau_ = tauei sigma_ = sigmaei ba_ = be_ bb_ = bi_ coll_ab = 'ei' end if ! Ion-electron collisions if(ab .eq. 'ie') then chi_ = SQRT(tauie/sigmaie) tau_ = tauie sigma_ = sigmaie ba_ = bi_ bb_ = be_ coll_ab = 'ie' end if ! set model parameter to FM type CALL set_model_fm ! end subroutine set_model !================================================================================ subroutine set_model_fm ! set mass/temperature ratio to FM type implicit none ! CALL FM_ENTER_USER_ROUTINE ! Set temperature and mass ratios to FM type sigmafm_ = TO_FM(sigma_) taufm_ = TO_FM(tau_) chifm_ = SQRT(taufm_/sigmafm_) ! Set perpendicular waves numbers to FM type bafm_ = TO_FM(ba_) bbfm_ = TO_FM(bb_) ! ! ! Set Sugama parameter thetaabfm_ = SQRT(TO_FM( taufm_ + chifm_**2)/(TO_FM(1) + chifm_**2)) thetabafm_ = SQRT(TO_FM( TO_FM(1)/taufm_ + TO_FM(1)/chifm_**2)/(TO_FM(1) + TO_FM(1)/chifm_**2)) ! CALL FM_EXIT_USER_ROUTINE end subroutine set_model_fm !================================================================================ subroutine invert_model ! inverse ab --> ba ! Used in the Sugama collision operator IMPLICIT NONE ! CALL FM_ENTER_USER_ROUTINE ! sigmafm_ = 1/sigmafm_ taufm_ = 1/taufm_ chifm_ = 1/chifm_ ! ! Set Sugama parameter thetaabfm_ = SQRT( (TO_FM(1) + sigmafm_)/(TO_FM(1) + sigmafm_/taufm_)) thetabafm_ = SQRT( (TO_FM(1) + TO_FM(1)/sigmafm_)/(TO_FM(1) + taufm_/sigmafm_)) ! CALL FM_EXIT_USER_ROUTINE ! END SUBROUTINE invert_model !================================================================================ SUBROUTINE operatormodel_readinput ! Read Model Operator from input file USE BASIC IMPLICIT NONE ! Namelist ! NAMELIST /OPERATOR_MODEL/ ETEST,ITEST,EBACK,IBACK,ESELF,ISELF ! NAMELIST /OPERATOR_MODEL/ DKTEST,DKBACK,ADDBACK,ADDTEST ! NAMELIST /OPERATOR_MODEL/ LWL,ADD_IS_TO_OS, GKC_USE_FULL NAMELIST /OPERATOR_MODEL/ etest_coll, itest_coll, eback_coll, iback_coll, eself_coll, iself_coll NAMELIST /OPERATOR_MODEL/ DKTEST,DKBACK,ADDBACK,ADDTEST NAMELIST /OPERATOR_MODEL/ LWL,ADD_IS_TO_OS, GKC_USE_FULL, GKC_USE_OPT ! IF(me .ne. 0) GOTO 111 READ(lu_in,OPERATOR_MODEL) WRITE(*,OPERATOR_MODEL) ! 111 CONTINUE ! ! MPI COMM call mpi_bcast( etest_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) call mpi_bcast( eback_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) call mpi_bcast( eself_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) call mpi_bcast( itest_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) call mpi_bcast( iback_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) call mpi_bcast( iself_coll, slen, MPI_CHARACTER, 0, MPI_COMM_WORLD, ierr) CALL MPI_bcast(LWL,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(DKTEST,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(DKBACK,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(ADDBACK,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(ADDTEST,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(ADD_IS_TO_OS,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(GKC_USE_FULL, 1, MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) CALL MPI_bcast(GKC_USE_OPT, 1, MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) ! ! Set collision operator flags and different other flags ! call set_eiT_flag call set_eiF_flag call set_ieT_flag call set_ieF_flag call set_ee_flag call set_ii_flag ! call set_coll_flags ! END SUBROUTINE operatormodel_readinput ! !------------------------------------------------------------ ! ! set collision operator model flags ! 0 = nothing ! 1 = coulomb ! 2 = pitch-angle (with constant coll.freq.) ! 3 = sugama ! 4 = pitch-angle with veloty dependent coll. freq. ! 5 = improved sugama ! 6 = Hirschman-Sigmar Clarke ! 7 = Abel (only for like species) ! 8 = conserving momentun pitch-angle operator (with velocity ! dependent coll. freq.) ! 9 = GK coulomb polarization term ! Note: check operator_model_mod.f90 routines for details. subroutine set_eiT_flag implicit none SELECT CASE( etest_coll ) ! electron test CASE ('dkcoulomb') ETEST = 1 GKE = 0 CASE ('gkcoulomb') ETEST =1 GKE =1 CASE ('dksugama') ETEST =3 GKE =0 CASE ('gksugama') ETEST =3 GKE =1 CASE ('dkimpsugama') ETEST =5 GKE =0 CASE ('gkimpsugama') ETEST =5 GKE =1 CASE ('dklorentz') ETEST =2 GKE =0 CASE ('dkpitch') ETEST =4 GKE = 0 CASE ('gkpitch') ETEST =4 GKE = 1 CASE ('hsclarke') ETEST = 6 GKE = 0 CASE ('none') ETEST = 0 GKE = 0 CASE DEFAULT ERROR STOP('ETEST_coll not defined ... ') END SELECT ! end subroutine set_eiT_flag ! !------------------------------------------------------------ ! subroutine set_eiF_flag implicit none SELECT CASE( eback_coll ) ! electron field CASE ('dkcoulomb') EBACK = 1 GKE = 0 CASE ('gkcoulomb') EBACK =1 GKE = 1 CASE ('dksugama') EBACK =3 GKE =0 CASE ('gksugama') EBACK =3 GKE =1 CASE ('dkimpsugama') EBACK =5 GKE =0 CASE ('gkimpsugama') EBACK =5 GKE =1 CASE ('hsclarke') EBACK = 6 GKE = 0 CASE ('none') EBACK = 0 GKE = 0 CASE DEFAULT ERROR STOP('EBACK_coll not defined ... ') END SELECT ! end subroutine set_eiF_flag ! !------------------------------------------------------------ ! subroutine set_ieT_flag implicit none SELECT CASE( itest_coll ) ! ion test CASE ('dkcoulomb') ITEST = 1 GKI = 0 CASE ('gkcoulomb') ITEST =1 GKI = 1 CASE ('dksugama') ITEST =3 GKI = 0 CASE ('gksugama') ITEST =3 GKI = 1 CASE ('dkimpsugama') ITEST =5 GKI = 0 CASE ('gkimpsugama') ITEST =5 GKI = 1 CASE ('hsclarke') ITEST = 6 GKI = 0 CASE ('none') ITEST = 0 GKI = 0 CASE DEFAULT ERROR STOP('ITEST_coll not defined ... ') END SELECT ! end subroutine set_ieT_flag ! !------------------------------------------------------------ ! subroutine set_ieF_flag implicit none SELECT CASE( iback_coll ) ! ion field CASE ('dkcoulomb') IBACK = 1 GKI = 0 CASE ('gkcoulomb') IBACK =1 GKI = 1 CASE ('dksugama') IBACK =3 GKI = 0 CASE ('gksugama') IBACK =3 GKI = 1 CASE ('dkimpsugama') IBACK =5 GKI = 0 CASE ('gkimpsugama') IBACK =5 GKI = 1 CASE ('hsclarke') IBACK = 6 GKI = 0 CASE ('none') IBACK = 0 GKI = 0 CASE DEFAULT ERROR STOP('IBACK_coll not defined ... ') END SELECT ! end subroutine set_ieF_flag ! !------------------------------------------------------------ ! subroutine set_ii_flag implicit none SELECT CASE( iself_coll ) ! ion field CASE ('dkcoulomb') ISELF = 1 GKI = 0 CASE ('gkcoulomb') ISELF =1 GKI = 1 CASE ('dksugama') ISELF =3 GKI = 0 CASE ('gksugama') ISELF =3 GKI = 1 CASE ('dkimpsugama') ISELF =5 GKI = 0 CASE ('gkimpsugama') ISELF =5 GKI = 1 CASE ('dklorentz') ISELF = 2 GKI = 0 CASE ('dkpitch_wof') ISELF = 4 GKI = 0 CASE ('gkpitch_wof') ISELF =4 GKI = 1 CASE ('dkpitch_wf') ISELF = 8 GKI = 0 CASE ('gkpitch_wf') ISELF = 8 GKI = 1 CASE ('hsclarke') ISELF = 6 GKI = 0 CASE('dkdougherty') ISELF = 10 GKI =0 CASE ('none') ISELF = 0 GKI = 0 CASE DEFAULT ERROR STOP('ISELF_coll not defined ... ') END SELECT ! end subroutine set_ii_flag ! !------------------------------------------------------------ ! subroutine set_ee_flag implicit none SELECT CASE( eself_coll ) ! ion field CASE ('dkcoulomb') ESELF = 1 GKE = 0 CASE ('gkcoulomb') ESELF =1 GKE = 1 CASE ('dksugama') ESELF =3 GKE = 0 CASE ('gksugama') ESELF =3 GKE = 1 CASE ('dkimpsugama') ESELF =5 GKE = 0 CASE ('gkimpsugama') ESELF =5 GKE = 1 CASE ('dklorentz') ESELF = 2 GKE = 0 CASE ('dkpitch_wf') ESELF = 8 GKE = 0 CASE ('gkpitch_wf') ESELF = 8 GKE = 1 CASE ('hsclarke') ESELF = 6 GKE = 0 CASE('dkdougherty') ESELF = 10 GKE =0 CASE ('none') ESELF = 0 GKE = 0 CASE DEFAULT ERROR STOP('ESELF_coll not defined ... ') END SELECT ! end subroutine set_ee_flag ! !----------------------------------------------------------------------------------------- ! subroutine set_coll_flags ! set coll flags implicit none ! If Sugama COOP IF(ETEST .eq. 3 .or. EBACK .eq. 3 .or. ITEST .eq. 3 .or. IBACK .eq. 3 .or. ESELF .eq. 3 .or. ISELF .eq. 3) THEN IFSUGAMA = .true. ENDIF ! If Improved Sugama COOP IF(ETEST .eq. 5 .or. EBACK .eq. 5 .or. ITEST .eq. 5 .or. IBACK .eq. 5 .or. ESELF .eq. 5 .or. ISELF .eq. 5) THEN IFSUGAMA = .true. IFIMPROVEDSUGAMA = .true. imaxx = JEmaxx ENDIF ! IF zeroth order Hirshman-Sigmar-Clarke (0HSC) IF(ETEST .eq. 6 .or. EBACK .eq. 6 .or. ITEST .eq. 6 .or. IBACK .eq. 6 .or. ESELF .eq. 6 .or. ISELF .eq. 6) THEN IF0HSC = .true. imaxx = JEmaxx ENDIF ! IF GK abel IF(ISELF .eq. 7 ) THEN IFABEL = .true. ENDIF ! IF GK Coulomb operator IF((ETEST .eq. 1 .or. EBACK .eq. 1 .or. ITEST .eq. 1 .or. IBACK .eq. 1 .or. ESELF .eq. 1 .or. ISELF .eq. 1) & .and. ((GKI .eq. 1) .or. (GKE .eq. 1)) ) THEN IFCOULOMB = .true. ENDIF ! IF gyrokinetic IF(GKE .eq. 1 .or. GKI .eq. 1) THEN IFGK = .true. ENDIF ! ! IF GK Polarization IF(ISELF .eq. 9) THEN IFPOL = .true. ENDIF ! IF(LWL) THEN IF( me .eq. 0) WRITE(*,*) 'Apply long wavelength approximation ...' ENDIF end subroutine set_coll_flags END MODULE model diff --git a/src/self_colls_mod.f90 b/src/self_colls_mod.f90 index 0cf9617..48bae81 100644 --- a/src/self_colls_mod.f90 +++ b/src/self_colls_mod.f90 @@ -1,447 +1,447 @@ MODULE self_colls ! self collisions module USE PREC_CONST USE BASIC USE BASIC_MPI USE MODEL USE ARRAY, ONLY: Ceedp,Ciidp,rCee,rCii USE OPERATOR_MODEL USE OUTPUT USE GRID use restart use auxval use gkcoulomb IMPLICIT NONE PROCEDURE(Caa_sub), POINTER :: evaluate_Cii_collisional_matrix => null() PROCEDURE(Caa_sub), POINTER :: evaluate_Cee_collisional_matrix => null() ABSTRACT INTERFACE SUBROUTINE Caa_sub ! Empty END SUBROUTINE Caa_sub END INTERFACE CONTAINS !_______________________________________________________________________ SUBROUTINE set_self_colls(ss) ! set self collisions parameters to species s IMPLICIT NONE ! ! CHARACTER(len=2),INTENT(IN):: ss ! CALL set_model(ss) ! ... set temperature/mass ratio to 1 for both a = [e,i] ! CALL set_basic(ss) ! ! END SUBROUTINE set_self_colls ! !_______________________________________________________________________ ! electron-electron collision SUBROUTINE ee_colls_control ! IMPLICIT NONE ! IF(me_self .eq. 0) WRITE(*,*) '====== Electron-Electron Collisions =======' IF( ESELF .ne. 0 ) THEN IF(me_self .eq. 0) WRITE(*,*) 'Set Electron-Electron Collisions ...' CALL set_self_colls('ee') ! ... electrons-slef collision CALL evaluate_auxval_field ! Restart IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('ee') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF IF(me_self .eq. 0) WRITE(*,*) 'Construct self collisional matrix Cee ... ' call set_Cee_collisional_matrix call evaluate_Cee_collisional_matrix WRITE(*,*) '... Cee constructed, me =', me_self ENDIF ! ! END SUBROUTINE ee_colls_control ! !_______________________________________________________________________ ! SUBROUTINE set_Cee_collisional_matrix ! Set evaluate_Cee_collisional_matrix routine IMPLICIT NONE ! ! IF (ESELF .ne. 0 ) THEN IF(IFCOULOMB .and. GKE .and. ESELF .eq. 1) THEN evaluate_Cee_collisional_matrix => Cee_gk_coulomb ! call set_gkcoulomb IF(.not. GKC_USE_FULL ) then call load_gk_coulomb_coeffs('ee') else call set_tabljpmf('s') ENDIF ! ELSE ! Evaluate Cee evaluate_Cee_collisional_matrix => Cee_dflt ! ENDIF ELSE evaluate_Cee_collisional_matrix => Cee_zeros_dflt ENDIF ! ! END SUBROUTINE set_Cee_collisional_matrix ! !_______________________________________________________________________ ! SUBROUTINE Cee_dflt ! evaluate electron-electron collision matrix use restart IMPLICIT NONE ! Local variables INTEGER :: irow_tmp,lbar_start INTEGER :: irow INTEGER, DIMENSION(2) :: lk ! current indices for restart INTEGER :: istep ! Allocate restart coll mat and restart indices IF(restart_from) CALL get_restart(Ceedp) lbar_start = lbaree_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbaree_s_l ENDIF istep=1 - IF( me .eq. 0 ) write(*, '(a,1x, i3,a)' ) 'Cee [x/ ', lbaree_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i3,a)' ) 'Cee [x/ ', numbe(Pmaxe,Jmaxe) ,']:' DO irow = lbar_start,lbaree_e_l irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) write(nscr,'(i3)', advance = 'no') irow flush(nscr) rCee(:) = ZEROFM CALL COLLISIONSELFE(lk(1),lk(2),rCee) Ceedp(irow,:) = TO_DP(rCee(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ee) THEN call restart_out(Ceedp, irow) istep = 1 ENDIF ENDDO ! IF(ifrestart) call restart_out(Ceedp, irow) ! END SUBROUTINE Cee_dflt !_______________________________________________________________________ ! ! SUBROUTINE Cee_zeros_dflt ! evaluate electron-electron collision matrix use restart IMPLICIT NONE ! Local variables INTEGER :: irow_tmp,lbar_start INTEGER :: irow INTEGER, DIMENSION(2) :: lk ! current indices for restart INTEGER :: istep lbar_start = lbaree_s_l DO irow = lbar_start,lbaree_e_l irow_tmp = rows_e(irow) lk = invnumbe(irow_tmp) rCee(:) = ZEROFM Ceedp(irow,:) = TO_DP(rCee(:)) ! save current state istep = istep +1 ENDDO ! ! END SUBROUTINE Cee_zeros_dflt ! !----------------------------------------------------------------- ! SUBROUTINE Cee_gk_coulomb ! Evaluate GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart(Ceedp) ! lbar_start = lbaree_s_l ! initialize indices lbar_start = lbaree_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbaree_s_l ENDIF istep=1 ! IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'Cee [x/ ', lbaree_e_l ,']:' ! DO irow=lbar_start,lbaree_e_l lbarjnnp = rows_e_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbe(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCee(:) = ZEROFM CALL coulombSelfGK(lk(1),lk(2),j,n,np,rCee) Ceedp(irow,:) = TO_DP(rCee(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ee) THEN ! flush current state every nsave_ee. call restart_out(Ceedp, irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(Ceedp, irow) ! END SUBROUTINE Cee_gk_coulomb ! !_______________________________________________________________________ ! ion-ion collision ! subroutine ii_colls_control ! ii_colls implicit none IF(me_self .eq. 0) WRITE(*,*) '====== Ion-Ion Collisions =======' IF( ISELF .ne. 0 ) THEN IF(me_self .eq. 0) WRITE(*,*) 'self Collisions ...' CALL set_self_colls('ii') ! ... self collision CALL evaluate_auxval_field ! Restart IF( ifrestart) THEN IF(me .eq. 0 ) WRITE(*,*) 'Restart ...' CALL restart_init('ii') IF(me .eq. 0 ) WRITE(*,*) '... restart done' ENDIF IF(me_self .eq. 0) WRITE(*,*) 'Construct ion-ion collisional matrix Cii ... ' call set_Cii_collisional_matrix CALL evaluate_Cii_collisional_matrix WRITE(*,*) '... Cii constructed, me =', me_self ENDIF ! end subroutine ii_colls_control ! !__________________________________________________________________ ! SUBROUTINE set_Cii_collisional_matrix ! Set evaluate_Cii_collisional_matrix routine IMPLICIT NONE ! ! IF (ISELF .ne. 0 ) THEN IF(IFCOULOMB .and. GKI .and. ISELF .eq. 1 ) THEN evaluate_Cii_collisional_matrix => Cii_gk_coulomb call set_gkcoulomb IF( .not. GKC_USE_FULL) THEN call load_gk_coulomb_coeffs('ii') ELSE call set_tabljpmf('s') ENDIF ELSE ! evaluate_Cii_collisional_matrix => Cii_dflt ! ENDIF ELSE evaluate_Cii_collisional_matrix => Cii_zeros_dflt ENDIF ! END SUBROUTINE set_Cii_collisional_matrix ! !_______________________________________________________________________ ! SUBROUTINE Cii_dflt ! evaluate ion-ion collision matrix use restart IMPLICIT NONE ! Local variables INTEGER :: irow_tmp,lbar_start INTEGER :: irow INTEGER, DIMENSION(2) :: lk ! current indices for restart INTEGER :: istep ! Allocate restart coll mat and restart indices IF(restart_from) CALL get_restart(Ciidp) lbar_start = lbarii_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbarii_s_l ENDIF istep=1 - IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'Cii [x/ ', lbarii_e_l ,']:' + IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'Cii [x/ ', numbi(Pmaxi,Jmaxi) ,']:' DO irow = lbar_start,lbarii_e_l irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(nscr,'(i5)', advance = 'no') irow flush(nscr) rCii(:) = ZEROFM CALL COLLISIONSELFI(lk(1),lk(2),rCii) Ciidp(irow,:) = TO_DP(rCii(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ii) THEN call restart_out(Ciidp, irow) istep = 1 ENDIF ENDDO ! IF(ifrestart) call restart_out(Ciidp, irow) ! END SUBROUTINE Cii_dflt !_______________________________________________________________________ ! ! SUBROUTINE Cii_zeros_dflt ! evaluate ion-ion collision matrix use restart IMPLICIT NONE ! Local variables INTEGER :: irow_tmp,lbar_start INTEGER :: irow INTEGER, DIMENSION(2) :: lk ! current indices for restart INTEGER :: istep lbar_start = lbarii_s_l DO irow = lbar_start,lbarii_e_l irow_tmp = rows_i(irow) lk = invnumbi(irow_tmp) write(*,*) 'Cii:', lk(1),'/',Pmaxi, ', ',lk(2),'/',Jmaxi rCii(:) = ZEROFM Ciidp(irow,:) = TO_DP(rCii(:)) ! save current state istep = istep +1 ENDDO ! ! END SUBROUTINE Cii_zeros_dflt ! !----------------------------------------------------------------- ! SUBROUTINE Cii_gk_coulomb ! Evaluate GK Coulomb use restart use gkcoulomb implicit none INTEGER :: l,k,irow INTEGER :: j,n,np,istep INTEGER :: lbar_start INTEGER, DIMENSION(4) :: lbarjnnp INTEGER, DIMENSION(2) :: lk ! ! ! restart IF(restart_from) CALL get_restart(Ciidp) ! ! initialize indices lbar_start = lbarii_s_l IF(restart_from) THEN lbar_start = row_rst_l +1 IF(lbar_start .eq. 1) lbar_start = lbarii_s_l ENDIF IF( me .eq. 0 ) write(*, '(a,1x, i5,a)' ) 'Cii [x/ ', lbarii_e_l ,']:' istep=1 ! DO irow=lbar_start,lbarii_e_l lbarjnnp = rows_i_4dim(irow,1:4) ! Hermite-Laguerre indices lk = invnumbi(lbarjnnp(1)) j = lbarjnnp(2) n = lbarjnnp(3) np = lbarjnnp(4) write(nscr,'(i5)', advance = 'no') lbarjnnp(1) flush(nscr) rCii(:) = ZEROFM CALL coulombSelfGK(lk(1),lk(2),j,n,np,rCii) Ciidp(irow,:) = TO_DP(rCii(:)) ! save current state istep = istep +1 IF(ifrestart .and. istep .gt. nsave_ii) THEN ! flush current state every nsave_ii. call restart_out(Ciidp,irow) istep = 1 ENDIF ENDDO ! flush out the final state IF(ifrestart) call restart_out(Ciidp, irow) ! END SUBROUTINE Cii_gk_Coulomb ! ! END MODULE self_colls